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"
43 type PodStatus struct {
51 func NewSBIClient(appmgrAddr, alertmgrAddr string, timo int) *SBIClient {
52 return &SBIClient{appmgrAddr, alertmgrAddr, time.Duration(timo) * time.Second}
55 func (s *SBIClient) CreateTransport(host string) *apiclient.RICAppmgr {
56 return apiclient.New(httptransport.New(host, "/ric/v1/", []string{"http"}), strfmt.Default)
59 func (s *SBIClient) BuildXappDescriptor(name, namespace, release, version string) *apimodel.XappDescriptor {
60 return &apimodel.XappDescriptor{
68 func (s *SBIClient) DeployXapp(xappDesc *apimodel.XappDescriptor) error {
69 params := apixapp.NewDeployXappParamsWithTimeout(s.timeout).WithXappDescriptor(xappDesc)
70 log.Info("SBI: DeployXapp=%v", params)
72 result, err := s.CreateTransport(s.appmgrAddr).Xapp.DeployXapp(params)
74 log.Error("SBI: DeployXapp unsuccessful: %v", err)
76 log.Info("SBI: DeployXapp successful: payload=%v", result.Payload)
81 func (s *SBIClient) UndeployXapp(xappDesc *apimodel.XappDescriptor) error {
82 name := *xappDesc.XappName
83 if xappDesc.ReleaseName != "" {
84 name = xappDesc.ReleaseName
87 params := apixapp.NewUndeployXappParamsWithTimeout(s.timeout).WithXAppName(name)
88 log.Info("SBI: UndeployXapp=%v", params)
90 result, err := s.CreateTransport(s.appmgrAddr).Xapp.UndeployXapp(params)
92 log.Error("SBI: UndeployXapp unsuccessful: %v", err)
94 log.Info("SBI: UndeployXapp successful: payload=%v", result)
99 func (s *SBIClient) GetDeployedXapps() error {
100 params := apixapp.NewGetAllXappsParamsWithTimeout(s.timeout)
101 result, err := s.CreateTransport(s.appmgrAddr).Xapp.GetAllXapps(params)
103 log.Error("GET unsuccessful: %v", err)
105 log.Info("GET successful: payload=%v", result.Payload)
110 func (s *SBIClient) BuildXappConfig(name, namespace string, configData interface{}) *apimodel.XAppConfig {
111 metadata := &apimodel.ConfigMetadata{
113 Namespace: &namespace,
116 return &apimodel.XAppConfig{
122 func (s *SBIClient) ModifyXappConfig(xappConfig *apimodel.XAppConfig) error {
123 params := apixapp.NewModifyXappConfigParamsWithTimeout(s.timeout).WithXAppConfig(xappConfig)
124 result, err := s.CreateTransport(s.appmgrAddr).Xapp.ModifyXappConfig(params)
126 log.Error("SBI: ModifyXappConfig unsuccessful: %v", err)
128 log.Info("SBI: ModifyXappConfig successful: payload=%v", result.Payload)
133 func (s *SBIClient) GetAllPodStatus(namespace string) ([]PodStatus, error) {
134 output, err := s.RunCommand(fmt.Sprintf("/usr/local/bin/kubectl get pod -n %s", namespace))
136 return []PodStatus{}, err
139 podStatusList := []PodStatus{}
141 re := regexp.MustCompile(fmt.Sprintf(`%s-.*`, namespace))
142 podList := re.FindAllStringSubmatch(string(output), -1)
144 for _, pod := range podList {
146 fmt.Sscanf(pod[0], "%s %s %s", &p.Name, &readyStr, &p.Status)
147 p.Name = strings.Split(p.Name, "-")[1]
148 p.Health = s.GetHealthState(readyStr)
150 podStatusList = append(podStatusList, p)
153 return podStatusList, nil
156 func (s *SBIClient) GetHealthState(ready string) (state string) {
157 result := strings.Split(ready, "/")
162 if result[0] == result[1] {
170 func (s *SBIClient) RunCommand(args string) (string, error) {
171 return CommandExec(args)
174 var CommandExec = func(args string) (string, error) {
175 cmd := exec.Command("/bin/sh", "-c", args)
176 var stdout bytes.Buffer
177 var stderr bytes.Buffer
181 xapp.Logger.Debug("Running command: '%s'", strings.Join(cmd.Args, " "))
182 if err := cmd.Run(); err != nil {
183 xapp.Logger.Error("Command failed (%s): %v - %s", strings.Join(cmd.Args, " "), err.Error(), stderr.String())
186 xapp.Logger.Debug("Command executed successfully!")
187 return stdout.String(), nil
190 func (s *SBIClient) GetAlerts() (*alert.GetAlertsOK, error) {
191 xapp.Logger.Info("Fetching alerts ...")
193 cr := clientruntime.New(s.alertmgrAddr, "/api/v2", []string{"http"})
194 resp, err := client.New(cr, strfmt.Default).Alert.GetAlerts(nil)
196 xapp.Logger.Error("Fetching alerts failed with error: %v", err)