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 ==================================================================================
25 httptransport "github.com/go-openapi/runtime/client"
26 "github.com/go-openapi/strfmt"
32 clientruntime "github.com/go-openapi/runtime/client"
33 "github.com/prometheus/alertmanager/api/v2/client"
34 "github.com/prometheus/alertmanager/api/v2/client/alert"
36 apiclient "gerrit.oran-osc.org/r/ric-plt/o1mediator/pkg/appmgrclient"
37 apixapp "gerrit.oran-osc.org/r/ric-plt/o1mediator/pkg/appmgrclient/xapp"
38 apimodel "gerrit.oran-osc.org/r/ric-plt/o1mediator/pkg/appmgrmodel"
40 "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'", cmd)
183 if err := cmd.Run(); err != nil {
184 xapp.Logger.Error("Command failed (%s): %v - %s", cmd, 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)