LMCL 1.4.4 - Nexus auth support
[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 import org.acumos.nexus.client.NexusArtifactClient;
39 import org.acumos.nexus.client.RepositoryLocation;
40
41 /**
42  * Defines all beans used to access outside services.
43  *
44  * By mocking this bean, all external access can be stubbed out.
45  */
46 public class Clients {
47         /*
48          * Implementation note:
49          *
50          * Ideally, all clients would be created at startup, and the getXXX()
51          * methods would just return them, however, while the Spring framework
52          * guarantees that @Autowired fields have been populated, before
53          * invoking @PostConstruct annotated methods and the afterPropertiesSet
54          * method, it doesn't guarantee that properties in those beans have
55          * been set, and the outcome is unrelable.  @Lazy could have been used,
56          * but it would need to be set both here, and in all the @Autowired
57          * uses: missing a single one, in future changes, would produce
58          * mysterious unrelable results.  So, instead, this code
59          * creates clients on first use and, where possible, keeps them for
60          * future use.
61          */
62
63         @Autowired
64         private FederationConfig federation;
65
66         @Autowired
67         private ServiceConfig cdmsConfig;
68
69         @Autowired
70         private NexusConfig nexusConfig;
71
72         @Autowired
73         private DockerConfig dockerConfig;
74
75         @Autowired
76         private ServiceConfig verificationConfig;
77
78         @Autowired
79         private ServiceConfig lmConfig;
80
81         private ICommonDataServiceRestClient cdsClient;
82         private NexusClient nexusClient;
83         private NexusArtifactClient nexusArtifactClient;
84         private ISecurityVerificationClientService svClient;
85         private LicenseAsset lmClient;
86
87         public FederationClient getFederationClient(String url) {
88                 /*
89                  * The set of peers can change, at runtime, and there is no
90                  * notification when one is deleted (or has its API URL
91                  * changed).  It would have been possible to keep federation
92                  * clients in a hash and fault them in, as needed, but, without
93                  * a means for identifying clients that were no longer needed,
94                  * that would have constituted a memory (and possibly a TCP/IP
95                  * connection) leak.  So this code does not cache federation
96                  * clients.
97                  */
98                 return new FederationClient(url, federation);
99         }
100
101         public synchronized ICommonDataServiceRestClient getCDSClient() {
102                 if (cdsClient == null) {
103                         String url = cdmsConfig.getUrl();
104                         ClientConfig cc = new ClientConfig();
105                         cc.setCreds(cdmsConfig);
106                         cdsClient = CommonDataServiceRestClientImpl.getInstance(url, ClientBase.buildRestTemplate(url, cc, null, null));
107                 }
108                 return cdsClient;
109         }
110
111         public synchronized NexusClient getNexusClient() {
112                 if (nexusClient == null) {
113                         ClientConfig cc = new ClientConfig();
114                         cc.setCreds(nexusConfig);
115                         nexusClient = new NexusClient(nexusConfig.getUrl(), cc);
116                 }
117                 return nexusClient;
118         }
119
120         public synchronized NexusArtifactClient getNexusArtifactClient() {
121                 if (nexusArtifactClient == null) {
122                         RepositoryLocation repositoryLocation = new RepositoryLocation();
123                         repositoryLocation.setId("1");
124                         repositoryLocation.setUrl(nexusConfig.getUrl());
125                         repositoryLocation.setUsername(nexusConfig.getUsername());
126                         repositoryLocation.setPassword(nexusConfig.getPassword());
127                         // TODO http proxy setup? asking this should be automatic based on https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html
128                         nexusArtifactClient = new NexusArtifactClient(repositoryLocation);
129                 }
130                 return nexusArtifactClient;
131         }
132
133         public synchronized DockerClient getDockerClient() {
134                 /*
135                  * For some reason, the DockerClient seems to go stale,
136                  * resulting in operations (like the docker pull command)
137                  * unexpectedly hanging, with no error or indication of a
138                  * problem.  Creating a fresh DockerClient on each
139                  * upload/download of a Docker image artifact, as a
140                  * workaround, seems to work.
141                  */
142                 return DockerClientBuilder.getInstance(
143                     DefaultDockerClientConfig.createDefaultConfigBuilder()
144                         .withDockerHost(dockerConfig.getHost())
145                         .withDockerTlsVerify(dockerConfig.getTlsVerify())
146                         .withDockerConfig(dockerConfig.getDockerConfig())
147                         .withDockerCertPath(dockerConfig.getDockerCertPath())
148                         .withApiVersion(dockerConfig.getApiVersion())
149                         .withRegistryUsername(dockerConfig.getRegistryUsername())
150                         .withRegistryPassword(dockerConfig.getRegistryPassword())
151                         .withRegistryEmail(dockerConfig.getRegistryEmail())
152                         .withRegistryUrl(dockerConfig.getRegistryUrl())
153                         .build()
154                     ).build();
155         }
156
157         public synchronized ISecurityVerificationClientService getSVClient() {
158                 if (svClient == null) {
159                         svClient = new SecurityVerificationClientServiceImpl(
160                             verificationConfig.getUrl(),
161                             cdmsConfig.getUrl(),
162                             cdmsConfig.getUsername(),
163                             cdmsConfig.getPassword(),
164                             nexusConfig.getUrl().replaceAll("/*$", "") + "/",
165                             nexusConfig.getUsername(),
166                             nexusConfig.getPassword());
167                 }
168                 return svClient;
169         }
170
171         public synchronized LicenseAsset getLMClient() {
172                 if (lmClient == null) {
173                         lmClient = new LicenseAsset(getCDSClient(), lmConfig.getUrl(), getNexusArtifactClient());
174                 }
175                 return lmClient;
176         }
177 }