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