a3a2b988d5468b1f01d98f08998a00e4a2e27107
[federation.git] / gateway / src / main / java / org / acumos / federation / gateway / Clients.java
1 /*-
2  * ===============LICENSE_START=======================================================
3  * Acumos
4  * ===================================================================================
5  * Copyright (C) 2017-2019 AT&T Intellectual Property & Tech Mahindra. All rights reserved.
6  * ===================================================================================
7  * This Acumos software file is distributed by AT&T and Tech Mahindra
8  * under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * This file is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ===============LICENSE_END=========================================================
19  */
20 package org.acumos.federation.gateway;
21
22 import org.springframework.beans.factory.annotation.Autowired;
23
24 import com.github.dockerjava.api.DockerClient;
25 import com.github.dockerjava.core.DefaultDockerClientConfig;
26 import com.github.dockerjava.core.DockerClientBuilder;
27
28 import org.acumos.cds.client.ICommonDataServiceRestClient;
29 import org.acumos.cds.client.CommonDataServiceRestClientImpl;
30
31 import org.acumos.federation.client.config.ClientConfig;
32 import org.acumos.federation.client.ClientBase;
33 import org.acumos.federation.client.FederationClient;
34
35 import org.acumos.securityverification.service.ISecurityVerificationClientService;
36 import org.acumos.securityverification.service.SecurityVerificationClientServiceImpl;
37 import org.acumos.licensemanager.client.rtu.LicenseAsset;
38
39 /**
40  * Defines all beans used to access outside services.
41  *
42  * By mocking this bean, all external access can be stubbed out.
43  */
44 public class Clients {
45         /*
46          * Implementation note:
47          *
48          * Ideally, all clients would be created at startup, and the getXXX()
49          * methods would just return them, however, while the Spring framework
50          * guarantees that @Autowired fields have been populated, before
51          * invoking @PostConstruct annotated methods and the afterPropertiesSet
52          * method, it doesn't guarantee that properties in those beans have
53          * been set, and the outcome is unrelable.  @Lazy could have been used,
54          * but it would need to be set both here, and in all the @Autowired
55          * uses: missing a single one, in future changes, would produce
56          * mysterious unrelable results.  So, instead, this code
57          * creates clients on first use and, where possible, keeps them for
58          * future use.
59          */
60
61         @Autowired
62         private FederationConfig federation;
63
64         @Autowired
65         private ServiceConfig cdmsConfig;
66
67         @Autowired
68         private NexusConfig nexusConfig;
69
70         @Autowired
71         private DockerConfig dockerConfig;
72
73         @Autowired
74         private ServiceConfig verificationConfig;
75
76         @Autowired
77         private ServiceConfig lmConfig;
78
79         private ICommonDataServiceRestClient cdsClient;
80         private NexusClient nexusClient;
81         private ISecurityVerificationClientService svClient;
82         private LicenseAsset lmClient;
83
84         public FederationClient getFederationClient(String url) {
85                 /*
86                  * The set of peers can change, at runtime, and there is no
87                  * notification when one is deleted (or has its API URL
88                  * changed).  It would have been possible to keep federation
89                  * clients in a hash and fault them in, as needed, but, without
90                  * a means for identifying clients that were no longer needed,
91                  * that would have constituted a memory (and possibly a TCP/IP
92                  * connection) leak.  So this code does not cache federation
93                  * clients.
94                  */
95                 return new FederationClient(url, federation);
96         }
97
98         public synchronized ICommonDataServiceRestClient getCDSClient() {
99                 if (cdsClient == null) {
100                         String url = cdmsConfig.getUrl();
101                         ClientConfig cc = new ClientConfig();
102                         cc.setCreds(cdmsConfig);
103                         cdsClient = CommonDataServiceRestClientImpl.getInstance(url, ClientBase.buildRestTemplate(url, cc, null, null));
104                 }
105                 return cdsClient;
106         }
107
108         public synchronized NexusClient getNexusClient() {
109                 if (nexusClient == null) {
110                         ClientConfig cc = new ClientConfig();
111                         cc.setCreds(nexusConfig);
112                         nexusClient = new NexusClient(nexusConfig.getUrl(), cc);
113                 }
114                 return nexusClient;
115         }
116
117         public synchronized DockerClient getDockerClient() {
118                 /*
119                  * For some reason, the DockerClient seems to go stale,
120                  * resulting in operations (like the docker pull command)
121                  * unexpectedly hanging, with no error or indication of a
122                  * problem.  Creating a fresh DockerClient on each
123                  * upload/download of a Docker image artifact, as a
124                  * workaround, seems to work.
125                  */
126                 return DockerClientBuilder.getInstance(
127                     DefaultDockerClientConfig.createDefaultConfigBuilder()
128                         .withDockerHost(dockerConfig.getHost())
129                         .withDockerTlsVerify(dockerConfig.getTlsVerify())
130                         .withDockerConfig(dockerConfig.getDockerConfig())
131                         .withDockerCertPath(dockerConfig.getDockerCertPath())
132                         .withApiVersion(dockerConfig.getApiVersion())
133                         .withRegistryUsername(dockerConfig.getRegistryUsername())
134                         .withRegistryPassword(dockerConfig.getRegistryPassword())
135                         .withRegistryEmail(dockerConfig.getRegistryEmail())
136                         .withRegistryUrl(dockerConfig.getRegistryUrl())
137                         .build()
138                     ).build();
139         }
140
141         public synchronized ISecurityVerificationClientService getSVClient() {
142                 if (svClient == null) {
143                         svClient = new SecurityVerificationClientServiceImpl(
144                             verificationConfig.getUrl(),
145                             cdmsConfig.getUrl(),
146                             cdmsConfig.getUsername(),
147                             cdmsConfig.getPassword(),
148                             nexusConfig.getUrl().replaceAll("/*$", "") + "/",
149                             nexusConfig.getUsername(),
150                             nexusConfig.getPassword());
151                 }
152                 return svClient;
153         }
154
155         public synchronized LicenseAsset getLMClient() {
156                 if (lmClient == null) {
157                         lmClient = new LicenseAsset(getCDSClient(), lmConfig.getUrl(), nexusConfig.getUrl().replaceAll("/*$", "") + "/");
158                 }
159                 return lmClient;
160         }
161 }