diff --git a/config/param/udm_param_config.yaml b/config/param/udm_param_config.yaml index 8c7e08a6..6b76de4f 100644 --- a/config/param/udm_param_config.yaml +++ b/config/param/udm_param_config.yaml @@ -329,6 +329,20 @@ udm: filter: "{\"0\":\"IPV4\",\"1\":\"IPV6\",\"2\":\"IPV4V6\",\"3\":\"Ethernet\",\"4\":\"Unstruction\",\"5\":\"IPV4 & IPV6\",\"6\":\"IPV4 & IPV4V6\",\"7\":\"IPV6 & IPV4V6\",\"8\":\"IPV4 & IPV6 & IPV4V6\"}" display: "Allowed PDU Session Types" comment: "" + - name: "5qi" + type: "int" + value: "9" + access: "read-write" + filter: "0~255" + display: "5qi" + comment: "" + - name: "priorityLevel" + type: "int" + value: "9" + access: "read-write" + filter: "1~127" + display: "Priority Level" + comment: "" - name: "defaultSSCmode" type: "enum" value: "0" @@ -399,20 +413,6 @@ udm: filter: "{\"0\":\"Null\",\"1\":\"Required\",\"2\":\"Preferred\",\"3\":\"Not Needed\"}" display: "User Plane Confidentiality" comment: "" - - name: "5qi" - type: "int" - value: "9" - access: "read-write" - filter: "0~255" - display: "5qi" - comment: "" - - name: "priorityLevel" - type: "int" - value: "9" - access: "read-write" - filter: "1~127" - display: "Priority Level" - comment: "" - name: "arpPriorityLevel" type: "int" value: "6" @@ -517,6 +517,34 @@ udm: filter: "{\"0\":\"IPV4\",\"1\":\"IPV6\",\"2\":\"IPV4V6\",\"3\":\"IPV4 or IPV6\"}" display: "Pdn Type" comment: "" + - name: "qci" + type: "int" + value: '9' + access: "read-write" + filter: '1~255' + display: "qci" + comment: "1~255" + - name: "arpPriorityLevel" + type: "int" + value: '8' + access: "read-write" + filter: '1~127' + display: "ARP Priority" + comment: "1~127" + - name: "arpPreemptCap" + type: "enum" + value: '0' + access: "read-write" + filter: "{\"0\":\"Not Preempt\",\"1\":\"May Preempt\"}" + display: "ARP Preemption Capability" + comment: "" + - name: "arpPreemptVuln" + type: "enum" + value: '0' + access: "read-write" + filter: "{\"0\":\"Not Preemptable\",\"1\":\"Preemptable\"}" + display: "ARP Preemption Vulnerability" + comment: "" - name: "contextIdentifier" type: "int" value: '1' @@ -559,34 +587,6 @@ udm: filter: '4~4' display: "Charging Characteristic" comment: "4~4" - - name: "qci" - type: "int" - value: '9' - access: "read-write" - filter: '1~255' - display: "qci" - comment: "1~255" - - name: "arpPriorityLevel" - type: "int" - value: '8' - access: "read-write" - filter: '1~127' - display: "ARP Priority" - comment: "1~127" - - name: "arpPreemptCap" - type: "enum" - value: '0' - access: "read-write" - filter: "{\"0\":\"Not Preempt\",\"1\":\"May Preempt\"}" - display: "ARP Preemption Capability" - comment: "" - - name: "arpPreemptVuln" - type: "enum" - value: '0' - access: "read-write" - filter: "{\"0\":\"Not Preemptable\",\"1\":\"Preemptable\"}" - display: "ARP Preemption Vulnerability" - comment: "" applicationServer: display: "Application Server" array: @@ -633,7 +633,7 @@ udm: display: "Rep Data Size Limit" comment: "0~65535" - name: "includeRegisterRequest" - type: "enum" + type: "bool" value: 'false' access: "read-write" filter: 'false;true;' diff --git a/features/cm/ne.go b/features/cm/ne.go index 6dae3c2e..98455073 100644 --- a/features/cm/ne.go +++ b/features/cm/ne.go @@ -28,11 +28,19 @@ var ( UriNeInfo = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo" // NE backup file UriNeCmFile = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}" + // service action uri, action: start/stop/restart + UriNeService = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/service/{action}" + // nf instance action uri, action: start/stop/restart + UriNeInstance = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/instance/{action}" CustomUriParamOmcNeConfig = config.UriPrefix + "/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig" CustomNeCmUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/cm" CustomUriNeInfo = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/neInfo" CustomUriNeCmFile = config.UriPrefix + "/systemManagement/{apiVersion}/{neType}/neBackup/{fileName}" + // service action uri, action: start/stop/restart + CustomUriNeService = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/service/{action}" + // nf instance action uri, action: start/stop/restart + CustomUriNeInstance = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/instance/{action}" ) func init() { @@ -737,3 +745,144 @@ func DeleteNeBackupFile(w http.ResponseWriter, r *http.Request) { services.ResponseStatusOK204NoContent(w) } + +func PostNeServiceAction(w http.ResponseWriter, r *http.Request) { + log.Debug("PostNeServiceAction processing... ") + + _, err := services.CheckFrontValidRequest(w, r) + if err != nil { + log.Error("Request error:", err) + return + } + + vars := mux.Vars(r) + neType := vars["elementTypeValue"] + if neType == "" { + log.Error("elementTypeValue is empty") + services.ResponseNotFound404UriNotExist(w, r) + return + } + //neTypeUpper := strings.ToUpper(neType) + neTypeLower := strings.ToLower(neType) + action := vars["action"] + + neId := services.GetUriParamString(r, "ne_id", ",", false, false) + + // neInfo := new(dborm.NeInfo) + neInfo, err := dborm.XormGetNeInfo(neType, neId) + if err != nil { + log.Errorf("Failed to get ne_info:", err) + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + log.Debug("neInfo:", neInfo) + + sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) + switch neTypeLower { + case "omc": + actionCmd := fmt.Sprintf("sudo %s/bin/omcsvc.sh %s", config.GetYamlConfig().NE.OmcDir, action) + cmd := exec.Command("ssh", sshHost, actionCmd) + out, err := cmd.CombinedOutput() + log.Debugf("Exec output: %v", string(out)) + if err != nil { + log.Error("Faile to execute ssh %s omc:", action, err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + case "ims": + actionCmd := fmt.Sprintf("sudo ims-%s", action) + cmd := exec.Command("ssh", sshHost, actionCmd) + out, err := cmd.CombinedOutput() + log.Debugf("Exec output: %v", string(out)) + if err != nil { + log.Error("Faile to execute ssh sudo ims-%s command:", action, err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + default: + actionCmd := fmt.Sprintf("sudo systemctl %s %s.service", action, neTypeLower) + cmd := exec.Command("ssh", sshHost, actionCmd) + out, err := cmd.CombinedOutput() + log.Debugf("Exec output: %v", string(out)) + if err != nil { + log.Error("Faile to execute ssh sudo systemctl command:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + + } + + services.ResponseStatusOK204NoContent(w) +} + +func PostNeInstanceAction(w http.ResponseWriter, r *http.Request) { + log.Debug("PostNeInstanceAction processing... ") + + _, err := services.CheckFrontValidRequest(w, r) + if err != nil { + log.Error("Request error:", err) + return + } + + vars := mux.Vars(r) + neType := vars["elementTypeValue"] + if neType == "" { + log.Error("elementTypeValue is empty") + services.ResponseNotFound404UriNotExist(w, r) + return + } + //neTypeUpper := strings.ToUpper(neType) + //neTypeLower := strings.ToLower(neType) + action := vars["action"] + + neId := services.GetUriParamString(r, "ne_id", ",", false, false) + + // neInfo := new(dborm.NeInfo) + neInfo, err := dborm.XormGetNeInfo(neType, neId) + if err != nil { + log.Errorf("Failed to get ne_info:", err) + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + log.Debug("neInfo:", neInfo) + + sshHost := fmt.Sprintf("%s@%s", config.GetYamlConfig().NE.User, neInfo.Ip) + switch action { + case "poweron": + actionCmd := "sudo poweron" + cmd := exec.Command("ssh", sshHost, actionCmd) + out, err := cmd.CombinedOutput() + log.Debugf("Exec output: %v", string(out)) + if err != nil { + log.Error("Faile to execute ssh %s omc:", action, err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + case "poweroff": + actionCmd := "sudo poweroff" + cmd := exec.Command("ssh", sshHost, actionCmd) + out, err := cmd.CombinedOutput() + log.Debugf("Exec output: %v", string(out)) + if err != nil { + log.Error("Faile to execute ssh sudo poweroff:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + case "reboot": + actionCmd := "sudo reboot" + cmd := exec.Command("ssh", sshHost, actionCmd) + out, err := cmd.CombinedOutput() + log.Debugf("Exec output: %v", string(out)) + if err != nil { + log.Error("Faile to execute ssh sudo reboot:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + default: + log.Error("Faile to execute ssh sudo systemctl command:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + + services.ResponseStatusOK204NoContent(w) +} diff --git a/features/cm/param.go b/features/cm/param.go index 09da3104..35e7b4a3 100644 --- a/features/cm/param.go +++ b/features/cm/param.go @@ -19,10 +19,8 @@ import ( var ( // parameter config management ParamConfigUri = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/config/{paraName}" - ParamConfigUrl = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/config/{paraName}" CustomParamConfigUri = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/config/{paraName}" - CustomParamConfigUrl = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/config/{paraName}" ) func GetParamConfigFromNF(w http.ResponseWriter, r *http.Request) { diff --git a/lib/routes/routes.go b/lib/routes/routes.go index 3bc6415b..c620488a 100644 --- a/lib/routes/routes.go +++ b/lib/routes/routes.go @@ -172,7 +172,10 @@ func init() { Register("POST", cm.CustomUriNeInfo, cm.PostNeInfo, nil) Register("PUT", cm.CustomUriNeInfo, cm.PutNeInfo, nil) Register("DELETE", cm.CustomUriNeInfo, cm.DeleteNeInfo, nil) - + //ne service action handle + Register("POST", cm.UriNeService, cm.PostNeServiceAction, nil) + //ne service action handle + Register("POST", cm.UriNeInstance, cm.PostNeInstanceAction, nil) // Post MML command to NF Register("POST", mml.UriMML, mml.PostMMLToNF, nil) Register("POST", mml.UriMMLDiscard, mml.PostMMLToNF, nil)