2176bbde4ef843d1db26cdc64fea47bc30dbfb20
[icn/sdwan.git] /
1 // SPDX-License-Identifier: Apache-2.0
2 // Copyright (c) 2020 Intel Corporation
3
4 package installappclient
5
6 import (
7         "context"
8         "sync"
9         "time"
10
11         log "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/logutils"
12         "github.com/open-ness/EMCO/src/orchestrator/pkg/infra/rpc"
13         installpb "github.com/open-ness/EMCO/src/rsync/pkg/grpc/installapp"
14         pkgerrors "github.com/pkg/errors"
15 )
16
17 const rsyncName = "rsync"
18
19 /*
20 RsyncInfo consists of rsyncName, hostName and portNumber.
21 */
22 type RsyncInfo struct {
23         RsyncName  string
24         hostName   string
25         portNumber int
26 }
27
28 var rsyncInfo RsyncInfo
29 var mutex = &sync.Mutex{}
30
31 type _testvars struct {
32         UseGrpcMock   bool
33         InstallClient installpb.InstallappClient
34 }
35
36 var Testvars _testvars
37
38 // InitRsyncClient initializes connctions to the Resource Synchronizer service
39 func initRsyncClient() bool {
40         if (RsyncInfo{}) == rsyncInfo {
41                 mutex.Lock()
42                 defer mutex.Unlock()
43                 log.Error("RsyncInfo not set. InitRsyncClient failed", log.Fields{
44                         "Rsyncname":  rsyncInfo.RsyncName,
45                         "Hostname":   rsyncInfo.hostName,
46                         "PortNumber": rsyncInfo.portNumber,
47                 })
48                 return false
49         }
50         rpc.UpdateRpcConn(rsyncInfo.RsyncName, rsyncInfo.hostName, rsyncInfo.portNumber)
51         return true
52 }
53
54 // NewRsyncInfo shall return a newly created RsyncInfo object
55 func NewRsyncInfo(rName, h string, pN int) RsyncInfo {
56         mutex.Lock()
57         defer mutex.Unlock()
58         rsyncInfo = RsyncInfo{RsyncName: rName, hostName: h, portNumber: pN}
59         return rsyncInfo
60
61 }
62
63 // InvokeInstallApp will make the grpc call to the resource synchronizer
64 // or rsync controller.
65 // rsync will deploy the resources in the app context to the clusters as
66 // prepared in the app context.
67 func InvokeInstallApp(appContextId string) error {
68         var err error
69         var rpcClient installpb.InstallappClient
70         var installRes *installpb.InstallAppResponse
71         ctx, cancel := context.WithTimeout(context.Background(), 600*time.Second)
72         defer cancel()
73
74         // Unit test helper code
75         if Testvars.UseGrpcMock {
76                 rpcClient = Testvars.InstallClient
77                 installReq := new(installpb.InstallAppRequest)
78                 installReq.AppContext = appContextId
79                 installRes, err = rpcClient.InstallApp(ctx, installReq)
80                 if err == nil {
81                         log.Info("Response from InstappApp GRPC call", log.Fields{
82                                 "Succeeded": installRes.AppContextInstalled,
83                                 "Message":   installRes.AppContextInstallMessage,
84                         })
85                 }
86                 return nil
87         }
88
89         conn := rpc.GetRpcConn(rsyncName)
90         if conn == nil {
91                 initRsyncClient()
92                 conn = rpc.GetRpcConn(rsyncName)
93         }
94
95         if conn != nil {
96                 rpcClient = installpb.NewInstallappClient(conn)
97                 installReq := new(installpb.InstallAppRequest)
98                 installReq.AppContext = appContextId
99                 installRes, err = rpcClient.InstallApp(ctx, installReq)
100                 if err == nil {
101                         log.Info("Response from InstappApp GRPC call", log.Fields{
102                                 "Succeeded": installRes.AppContextInstalled,
103                                 "Message":   installRes.AppContextInstallMessage,
104                         })
105                 }
106         } else {
107                 return pkgerrors.Errorf("InstallApp Failed - Could not get InstallAppClient: %v", "rsync")
108         }
109
110         if err == nil {
111                 if installRes.AppContextInstalled {
112                         log.Info("InstallApp Success", log.Fields{
113                                 "AppContext": appContextId,
114                                 "Message":    installRes.AppContextInstallMessage,
115                         })
116                         return nil
117                 } else {
118                         return pkgerrors.Errorf("InstallApp Failed: %v", installRes.AppContextInstallMessage)
119                 }
120         }
121         return err
122 }
123
124 func InvokeUninstallApp(appContextId string) error {
125         var err error
126         var rpcClient installpb.InstallappClient
127         var uninstallRes *installpb.UninstallAppResponse
128         ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
129         defer cancel()
130
131         conn := rpc.GetRpcConn(rsyncName)
132         if conn == nil {
133                 initRsyncClient()
134                 conn = rpc.GetRpcConn(rsyncName)
135         }
136
137         if conn != nil {
138                 rpcClient = installpb.NewInstallappClient(conn)
139                 uninstallReq := new(installpb.UninstallAppRequest)
140                 uninstallReq.AppContext = appContextId
141                 uninstallRes, err = rpcClient.UninstallApp(ctx, uninstallReq)
142                 if err == nil {
143                         log.Info("Response from UninstappApp GRPC call", log.Fields{
144                                 "Succeeded": uninstallRes.AppContextUninstalled,
145                                 "Message":   uninstallRes.AppContextUninstallMessage,
146                         })
147                 }
148         } else {
149                 return pkgerrors.Errorf("UninstallApp Failed - Could not get InstallAppClient: %v", "rsync")
150         }
151
152         if err == nil {
153                 if uninstallRes.AppContextUninstalled {
154                         log.Info("UninstallApp Success", log.Fields{
155                                 "AppContext": appContextId,
156                                 "Message":    uninstallRes.AppContextUninstallMessage,
157                         })
158                         return nil
159                 } else {
160                         return pkgerrors.Errorf("UninstallApp Failed: %v", uninstallRes.AppContextUninstallMessage)
161                 }
162         }
163         return err
164 }