2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
26 httptransport "github.com/go-openapi/runtime/client"
27 "github.com/go-openapi/strfmt"
33 clientruntime "github.com/go-openapi/runtime/client"
34 "github.com/prometheus/alertmanager/api/v2/client"
35 "github.com/prometheus/alertmanager/api/v2/client/alert"
37 apiclient "gerrit.oran-osc.org/r/ric-plt/o1mediator/pkg/appmgrclient"
38 apixapp "gerrit.oran-osc.org/r/ric-plt/o1mediator/pkg/appmgrclient/xapp"
39 apimodel "gerrit.oran-osc.org/r/ric-plt/o1mediator/pkg/appmgrmodel"
41 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
44 type PodStatus struct {
52 func NewSBIClient(appmgrAddr, alertmgrAddr string, timo int) *SBIClient {
53 return &SBIClient{appmgrAddr, alertmgrAddr, time.Duration(timo) * time.Second}
56 func (s *SBIClient) CreateTransport(host string) *apiclient.RICAppmgr {
57 return apiclient.New(httptransport.New(host, "/ric/v1/", []string{"http"}), strfmt.Default)
60 func (s *SBIClient) BuildXappDescriptor(name, namespace, release, version string) *apimodel.XappDescriptor {
61 return &apimodel.XappDescriptor{
69 func (s *SBIClient) DeployXapp(xappDesc *apimodel.XappDescriptor) error {
70 params := apixapp.NewDeployXappParamsWithTimeout(s.timeout).WithXappDescriptor(xappDesc)
71 log.Info("SBI: DeployXapp=%v", params)
73 result, err := s.CreateTransport(s.appmgrAddr).Xapp.DeployXapp(params)
75 log.Error("SBI: DeployXapp unsuccessful: %v", err)
77 log.Info("SBI: DeployXapp successful: payload=%v", result.Payload)
82 func (s *SBIClient) UndeployXapp(xappDesc *apimodel.XappDescriptor) error {
83 name := *xappDesc.XappName
84 if xappDesc.ReleaseName != "" {
85 name = xappDesc.ReleaseName
88 params := apixapp.NewUndeployXappParamsWithTimeout(s.timeout).WithXAppName(name)
89 log.Info("SBI: UndeployXapp=%v", params)
91 result, err := s.CreateTransport(s.appmgrAddr).Xapp.UndeployXapp(params)
93 log.Error("SBI: UndeployXapp unsuccessful: %v", err)
95 log.Info("SBI: UndeployXapp successful: payload=%v", result)
100 func (s *SBIClient) GetDeployedXapps() error {
101 params := apixapp.NewGetAllXappsParamsWithTimeout(s.timeout)
102 result, err := s.CreateTransport(s.appmgrAddr).Xapp.GetAllXapps(params)
104 log.Error("GET unsuccessful: %v", err)
106 log.Info("GET successful: payload=%v", result.Payload)
111 func (s *SBIClient) BuildXappConfig(name, namespace string, configData interface{}) *apimodel.XAppConfig {
112 metadata := &apimodel.ConfigMetadata{
114 Namespace: &namespace,
117 return &apimodel.XAppConfig{
123 func (s *SBIClient) ModifyXappConfig(xappConfig *apimodel.XAppConfig) error {
124 params := apixapp.NewModifyXappConfigParamsWithTimeout(s.timeout).WithXAppConfig(xappConfig)
125 result, err := s.CreateTransport(s.appmgrAddr).Xapp.ModifyXappConfig(params)
127 log.Error("SBI: ModifyXappConfig unsuccessful: %v", err)
129 log.Info("SBI: ModifyXappConfig successful: payload=%v", result.Payload)
134 func (s *SBIClient) GetAllPodStatus(namespace string) ([]PodStatus, error) {
135 output, err := s.RunCommand(fmt.Sprintf("/usr/local/bin/kubectl get pod -n %s", namespace))
137 return []PodStatus{}, err
140 podStatusList := []PodStatus{}
142 re := regexp.MustCompile(fmt.Sprintf(`%s-.*`, namespace))
143 podList := re.FindAllStringSubmatch(string(output), -1)
145 for _, pod := range podList {
147 fmt.Sscanf(pod[0], "%s %s %s", &p.Name, &readyStr, &p.Status)
148 p.Name = strings.Split(p.Name, "-")[1]
149 p.Health = s.GetHealthState(readyStr)
151 podStatusList = append(podStatusList, p)
154 return podStatusList, nil
157 func (s *SBIClient) GetHealthState(ready string) (state string) {
158 result := strings.Split(ready, "/")
163 if result[0] == result[1] {
171 func (s *SBIClient) RunCommand(args string) (string, error) {
172 return CommandExec(args)
175 var CommandExec = func(args string) (string, error) {
176 cmd := exec.Command("/bin/sh", "-c", args)
177 var stdout bytes.Buffer
178 var stderr bytes.Buffer
182 xapp.Logger.Debug("Running command: '%s'", strings.Join(cmd.Args, " "))
183 if err := cmd.Run(); err != nil {
184 xapp.Logger.Error("Command failed (%s): %v - %s", strings.Join(cmd.Args, " "), err.Error(), stderr.String())
187 xapp.Logger.Debug("Command executed successfully!")
188 return stdout.String(), nil
191 func (s *SBIClient) GetAlerts() (*alert.GetAlertsOK, error) {
192 xapp.Logger.Info("Fetching alerts ...")
194 cr := clientruntime.New(s.alertmgrAddr, "/api/v2", []string{"http"})
195 resp, err := client.New(cr, strfmt.Default).Alert.GetAlerts(nil)
197 xapp.Logger.Error("Fetching alerts failed with error: %v", err)
204 func (s *SBIClient) GetAllDeployedXappsConfig() ([]string, []string) {
206 //Trigger http rest api to appmgr to get config of all deployed xapps
207 params := apixapp.NewGetAllXappConfigParamsWithTimeout(s.timeout)
208 result, err := s.CreateTransport(s.appmgrAddr).Xapp.GetAllXappConfig(params)
210 log.Error("GetAllDeployedXappsConfig() unsuccessful: %v", err)
214 var xappCfgList []string
215 var xappNameList []string
216 var allXappCfg apimodel.AllXappConfig
218 allXappCfg = apimodel.AllXappConfig(result.Payload)
219 for i, xappCfg := range allXappCfg {
221 var xappJsonStrCfg string
222 xappName = string(*(xappCfg.Metadata.XappName))
223 xappJsonCfgMap := xappCfg.Config.(map[string]interface{})
224 bs, err := json.Marshal(xappJsonCfgMap)
226 log.Error("json marshal failure after AllXappConfig: %v", err)
229 xappJsonStrCfg = string(bs)
230 log.Info(" %d %s xapp config json data: %v", i, xappName, xappJsonStrCfg)
231 xappCfgList = append(xappCfgList, xappJsonStrCfg)
232 xappNameList = append(xappNameList, xappName)
235 return xappNameList, xappCfgList