Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Delete DG operation, remove the DG from the NS list #291

2 changes: 1 addition & 1 deletion configapi/api_default.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ func NetworkSliceSliceNameDelete(c *gin.Context) {
// @Failure 401 {object} nil "Authorization failed"
// @Failure 403 {object} nil "Forbidden"
// @Failure 500 {object} nil "Error creating network slice"
// @Router /config/v1/network-slice/{sliceName [post]
// @Router /config/v1/network-slice/{sliceName} [post]
func NetworkSliceSliceNamePost(c *gin.Context) {
logger.ConfigLog.Debugf("Received NetworkSliceSliceNamePost ")
if ret := NetworkSlicePostHandler(c, configmodels.Post_op); ret {
Expand Down
27 changes: 27 additions & 0 deletions dbadapter/db_adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,37 @@
package dbadapter

import (
"context"
"time"

"github.com/omec-project/util/mongoapi"
"github.com/omec-project/webconsole/backend/logger"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
)

type DBInterface interface {
RestfulAPIGetOne(collName string, filter bson.M) (map[string]interface{}, error)
RestfulAPIGetMany(collName string, filter bson.M) ([]map[string]interface{}, error)
RestfulAPIPutOneTimeout(collName string, filter bson.M, putData map[string]interface{}, timeout int32, timeField string) bool
RestfulAPIPutOne(collName string, filter bson.M, putData map[string]interface{}) (bool, error)
RestfulAPIPutOneWithContext(collName string, filter bson.M, putData map[string]interface{}, context context.Context) (bool, error)
RestfulAPIPutOneNotUpdate(collName string, filter bson.M, putData map[string]interface{}) (bool, error)
RestfulAPIPutMany(collName string, filterArray []primitive.M, putDataArray []map[string]interface{}) error
RestfulAPIDeleteOne(collName string, filter bson.M) error
RestfulAPIDeleteOneWithContext(collName string, filter bson.M, context context.Context) error
RestfulAPIDeleteMany(collName string, filter bson.M) error
RestfulAPIMergePatch(collName string, filter bson.M, patchData map[string]interface{}) error
RestfulAPIJSONPatch(collName string, filter bson.M, patchJSON []byte) error
RestfulAPIJSONPatchWithContext(collName string, filter bson.M, patchJSON []byte, context context.Context) error
RestfulAPIJSONPatchExtend(collName string, filter bson.M, patchJSON []byte, dataName string) error
RestfulAPIPost(collName string, filter bson.M, postData map[string]interface{}) (bool, error)
RestfulAPIPostMany(collName string, filter bson.M, postDataArray []interface{}) error
RestfulAPICount(collName string, filter bson.M) (int64, error)
CreateIndex(collName string, keyField string) (bool, error)
StartSession() (mongo.Session, error)
SupportsTransactions() (bool, error)
}

var (
Expand Down Expand Up @@ -88,6 +95,10 @@ func (db *MongoDBClient) RestfulAPIPutOne(collName string, filter bson.M, putDat
return db.MongoClient.RestfulAPIPutOne(collName, filter, putData)
}

func (db *MongoDBClient) RestfulAPIPutOneWithContext(collName string, filter bson.M, putData map[string]interface{}, context context.Context) (bool, error) {
return db.MongoClient.RestfulAPIPutOneWithContext(collName, filter, putData, context)
}

func (db *MongoDBClient) RestfulAPIPutOneNotUpdate(collName string, filter bson.M, putData map[string]interface{}) (bool, error) {
return db.MongoClient.RestfulAPIPutOneNotUpdate(collName, filter, putData)
}
Expand All @@ -100,6 +111,10 @@ func (db *MongoDBClient) RestfulAPIDeleteOne(collName string, filter bson.M) err
return db.MongoClient.RestfulAPIDeleteOne(collName, filter)
}

func (db *MongoDBClient) RestfulAPIDeleteOneWithContext(collName string, filter bson.M, context context.Context) error {
return db.MongoClient.RestfulAPIDeleteOneWithContext(collName, filter, context)
}

func (db *MongoDBClient) RestfulAPIDeleteMany(collName string, filter bson.M) error {
return db.MongoClient.RestfulAPIDeleteMany(collName, filter)
}
Expand All @@ -112,6 +127,10 @@ func (db *MongoDBClient) RestfulAPIJSONPatch(collName string, filter bson.M, pat
return db.MongoClient.RestfulAPIJSONPatch(collName, filter, patchJSON)
}

func (db *MongoDBClient) RestfulAPIJSONPatchWithContext(collName string, filter bson.M, patchJSON []byte, context context.Context) error {
return db.MongoClient.RestfulAPIJSONPatchWithContext(collName, filter, patchJSON, context)
}

func (db *MongoDBClient) RestfulAPIJSONPatchExtend(collName string, filter bson.M, patchJSON []byte, dataName string) error {
return db.MongoClient.RestfulAPIJSONPatchExtend(collName, filter, patchJSON, dataName)
}
Expand All @@ -131,3 +150,11 @@ func (db *MongoDBClient) RestfulAPICount(collName string, filter bson.M) (int64,
func (db *MongoDBClient) CreateIndex(collName string, keyField string) (bool, error) {
return db.MongoClient.CreateIndex(collName, keyField)
}

func (db *MongoDBClient) StartSession() (mongo.Session, error) {
return db.MongoClient.StartSession()
}

func (db *MongoDBClient) SupportsTransactions() (bool, error) {
return db.MongoClient.SupportsTransactions()
}
67 changes: 31 additions & 36 deletions docs/docs.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2024 Canonical Ltd

// Package docs Code generated by swaggo/swag. DO NOT EDIT
package docs

Expand Down Expand Up @@ -849,14 +846,17 @@ const docTemplate = `{
}
}
},
"/config/v1/network-slice/{sliceName": {
"post": {
"/config/v1/network-slice/{sliceName}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "Create a new network slice",
"description": "Return the network slice",
"produces": [
"application/json"
],
"tags": [
"Network Slices"
],
Expand All @@ -867,47 +867,36 @@ const docTemplate = `{
"name": "sliceName",
"in": "path",
"required": true
},
{
"description": " ",
"name": "content",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/configmodels.Slice"
}
}
],
"responses": {
"200": {
"description": "Network slice created"
},
"400": {
"description": "Invalid network slice content"
"description": "Network slice",
"schema": {
"$ref": "#/definitions/configmodels.Slice"
}
},
"401": {
"description": "Authorization failed"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Network slices not found"
},
"500": {
"description": "Error creating network slice"
"description": "Error retrieving network slice"
}
}
}
},
"/config/v1/network-slice/{sliceName}": {
"get": {
},
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "Return the network slice",
"produces": [
"application/json"
],
"description": "Create a new network slice",
"tags": [
"Network Slices"
],
Expand All @@ -918,26 +907,32 @@ const docTemplate = `{
"name": "sliceName",
"in": "path",
"required": true
},
{
"description": " ",
"name": "content",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/configmodels.Slice"
}
}
],
"responses": {
"200": {
"description": "Network slice",
"schema": {
"$ref": "#/definitions/configmodels.Slice"
}
"description": "Network slice created"
},
"400": {
"description": "Invalid network slice content"
},
"401": {
"description": "Authorization failed"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "Network slices not found"
},
"500": {
"description": "Error retrieving network slice"
"description": "Error creating network slice"
}
}
},
Expand Down
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ require (
github.com/mitchellh/mapstructure v1.5.0
github.com/omec-project/config5g v1.5.5
github.com/omec-project/openapi v1.3.2
github.com/omec-project/util v1.2.8
github.com/omec-project/util v1.2.10
github.com/prometheus/client_golang v1.20.5
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
Expand Down Expand Up @@ -49,7 +49,7 @@ require (
github.com/golang/snappy v0.0.4 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.17.9 // indirect
github.com/klauspost/compress v1.17.11 // indirect
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
Expand All @@ -72,7 +72,7 @@ require (
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/arch v0.12.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/text v0.21.0 // indirect
Expand Down
12 changes: 6 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
Expand Down Expand Up @@ -116,8 +116,8 @@ github.com/omec-project/config5g v1.5.5 h1:9ouNkogjNBPi4Qa0gz12Ab4pl8gp5XWvELTCD
github.com/omec-project/config5g v1.5.5/go.mod h1:r5K7D2jMigypWWcWJDUZlgpcH8gOAvPT6phtKESGzNs=
github.com/omec-project/openapi v1.3.2 h1:LhUA/vBKCswN0S8fc/dN5/xuUltLgoak6au2MAKwUkk=
github.com/omec-project/openapi v1.3.2/go.mod h1:JByn0faBQbiWX/q3JA+FHOdQS9m6KdyHDF5VVjCGMms=
github.com/omec-project/util v1.2.8 h1:yiR/YfItbmm7to3chyLr+YxjcN3BvQUNre6fu75yFDI=
github.com/omec-project/util v1.2.8/go.mod h1:wTonG4t81Cf4zSNid3/SGYtEEWd926LBOXbD827/Bs0=
github.com/omec-project/util v1.2.10 h1:FaLz5Msn6wqq8tHREEE0F/GPGbZmz0dRLlWp3E82B5Y=
github.com/omec-project/util v1.2.10/go.mod h1:P+WFVCtuLfsrfTgWZLaR5S6QCnA94PT7KdV6KSAFbw8=
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
Expand Down Expand Up @@ -203,8 +203,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
Expand Down
74 changes: 71 additions & 3 deletions proto/server/configEvtHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package server

import (
context "context"
"encoding/json"
"fmt"
"os/exec"
Expand All @@ -18,6 +19,7 @@
"github.com/omec-project/webconsole/configmodels"
"github.com/omec-project/webconsole/dbadapter"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
)

const (
Expand Down Expand Up @@ -190,14 +192,80 @@
config5gMsg.PrevDevGroup = getDeviceGroupByName(configMsg.DevGroupName)
subsUpdateChan <- &config5gMsg
patriciareinoso marked this conversation as resolved.
Show resolved Hide resolved
}
filter := bson.M{"group-name": configMsg.DevGroupName}
err := dbadapter.CommonDBClient.RestfulAPIDeleteOne(devGroupDataColl, filter)
err := deleteDeviceGroupAsTransaction(configMsg.DevGroupName)
if err != nil {
logger.DbLog.Warnln(err)
logger.DbLog.Errorw("failed to delete Device Group", "error", err)
}
rwLock.Unlock()
}

func deleteDeviceGroupAsTransaction(deviceGroupName string) error {
session, err := dbadapter.CommonDBClient.StartSession()
if err != nil {
return fmt.Errorf("failed to initialize DB session: %w", err)
}
ctx := context.TODO()
defer session.EndSession(ctx)
filter := bson.M{"group-name": deviceGroupName}
return mongo.WithSession(ctx, session, func(sc mongo.SessionContext) error {
if err := session.StartTransaction(); err != nil {

Check failure on line 211 in proto/server/configEvtHandler.go

View workflow job for this annotation

GitHub Actions / lint

shadow: declaration of "err" shadows declaration at line 203 (govet)
return fmt.Errorf("failed to start transaction: %w", err)
}
if err = dbadapter.CommonDBClient.RestfulAPIDeleteOneWithContext(devGroupDataColl, filter, sc); err != nil {
if abortErr := session.AbortTransaction(sc); abortErr != nil {
logger.DbLog.Errorw("failed to abort transaction", "error", abortErr)
}
return fmt.Errorf("failed to delete Device Group from collection: %w", err)
}
if err = updateDeviceGroupListInNetworkSlices(deviceGroupName, sc); err != nil {
if abortErr := session.AbortTransaction(sc); abortErr != nil {
logger.DbLog.Errorw("failed to abort transaction", "error", abortErr)
}
return fmt.Errorf("failed to update network slices: %w", err)
}
return session.CommitTransaction(sc)
})
}

Check failure on line 228 in proto/server/configEvtHandler.go

View workflow job for this annotation

GitHub Actions / lint

File is not properly formatted (gofumpt)
func updateDeviceGroupListInNetworkSlices(deviceGroupName string, context context.Context) error {
patriciareinoso marked this conversation as resolved.
Show resolved Hide resolved
filterByDeviceGroup := bson.M{
"site-device-group": bson.M{
"$elemMatch": bson.M{
"$eq": deviceGroupName,
},
},
}
rawNetworkSlices, err := dbadapter.CommonDBClient.RestfulAPIGetMany(sliceDataColl, filterByDeviceGroup)
if err != nil {
return fmt.Errorf("failed to fetch network slices: %w", err)
}
for _, rawNetworkSlice := range rawNetworkSlices {
var networkSlice configmodels.Slice
if err = json.Unmarshal(configmodels.MapToByte(rawNetworkSlice), &networkSlice); err != nil {
return fmt.Errorf("error unmarshaling network slice: %v", err)
}
filteredDeviceGroups := []string{}
for _, deviceGroup := range networkSlice.SiteDeviceGroup {
if deviceGroup != deviceGroupName {
filteredDeviceGroups = append(filteredDeviceGroups, deviceGroup)
}
}
filteredDeviceGroupsJSON, err := json.Marshal(filteredDeviceGroups)
if err != nil {
return fmt.Errorf("error marshaling device groups: %v", err)
}
patchJSON := []byte(
fmt.Sprintf(`[{"op": "replace", "path": "/site-device-group", "value": %s}]`,
string(filteredDeviceGroupsJSON)),
)
filterBySliceName := bson.M{"slice-name": networkSlice.SliceName}
err = dbadapter.CommonDBClient.RestfulAPIJSONPatchWithContext(sliceDataColl, filterBySliceName, patchJSON, context)
if err != nil {
return err
}
}
return nil
}

func handleNetworkSlicePost(configMsg *configmodels.ConfigMessage, subsUpdateChan chan *Update5GSubscriberMsg) {
rwLock.Lock()
if factory.WebUIConfig.Configuration.Mode5G {
Expand Down
Loading