-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathBaseSkyflow.java
More file actions
208 lines (174 loc) · 8.11 KB
/
Copy pathBaseSkyflow.java
File metadata and controls
208 lines (174 loc) · 8.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
package com.skyflow;
import com.skyflow.config.BaseVaultConfig;
import com.skyflow.config.Credentials;
import com.skyflow.enums.LogLevel;
import com.skyflow.errors.ErrorCode;
import com.skyflow.errors.ErrorMessage;
import com.skyflow.errors.SkyflowException;
import com.skyflow.logs.ErrorLogs;
import com.skyflow.logs.InfoLogs;
import com.skyflow.utils.BaseUtils;
import com.skyflow.utils.logger.LogUtil;
import com.skyflow.utils.validations.BaseValidations;
import java.util.LinkedHashMap;
import java.util.Map;
abstract class BaseSkyflow<Self extends BaseSkyflow, V extends BaseVaultConfig> implements ISkyflow<Self, V, Credentials> {
protected final BaseSkyflowClientBuilder<V> builder;
protected BaseSkyflow(BaseSkyflowClientBuilder<V> builder) {
this.builder = builder;
LogUtil.printInfoLog(InfoLogs.CLIENT_INITIALIZED.getLog());
}
protected abstract Self self();
@Override
public Self addVaultConfig(V vaultConfig) throws SkyflowException {
this.builder.addVaultConfigTemplate(vaultConfig);
return self();
}
public V getVaultConfig(String vaultId) {
return this.builder.vaultConfigMap.get(vaultId);
}
@Override
public Self updateVaultConfig(V vaultConfig) throws SkyflowException {
this.builder.updateVaultConfigTemplate(vaultConfig);
return self();
}
@Override
public Self removeVaultConfig(String vaultId) throws SkyflowException {
this.builder.removeVaultConfigTemplate(vaultId);
return self();
}
@Override
public Self updateSkyflowCredentials(Credentials credentials) throws SkyflowException {
this.builder.addSkyflowCredentialsTemplate(credentials);
return self();
}
@Override
public Self setLogLevel(LogLevel logLevel) {
this.builder.setLogLevel(logLevel);
return self();
}
@Override
public LogLevel getLogLevel() {
return this.builder.logLevel;
}
protected static <T> T resolveOrThrow(Map<String, T> map, String key,
ErrorLogs errorLog, ErrorMessage errorMessage) throws SkyflowException {
T value = key != null ? map.get(key) : map.values().stream().findFirst().orElse(null);
if (value == null) {
LogUtil.printErrorLog(errorLog.getLog());
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), errorMessage.getMessage());
}
return value;
}
abstract static class BaseSkyflowClientBuilder<V extends BaseVaultConfig> {
protected final LinkedHashMap<String, V> vaultConfigMap = new LinkedHashMap<>();
protected Credentials skyflowCredentials;
protected LogLevel logLevel = LogLevel.ERROR;
protected BaseSkyflowClientBuilder() {
}
public BaseSkyflowClientBuilder<V> addVaultConfig(V vaultConfig) throws SkyflowException {
addVaultConfigTemplate(vaultConfig);
return this;
}
public BaseSkyflowClientBuilder<V> updateVaultConfig(V vaultConfig) throws SkyflowException {
updateVaultConfigTemplate(vaultConfig);
return this;
}
public BaseSkyflowClientBuilder<V> removeVaultConfig(String vaultId) throws SkyflowException {
removeVaultConfigTemplate(vaultId);
return this;
}
public BaseSkyflowClientBuilder<V> addSkyflowCredentials(Credentials credentials) throws SkyflowException {
addSkyflowCredentialsTemplate(credentials);
return this;
}
protected BaseSkyflowClientBuilder<V> setLogLevel(LogLevel logLevel) {
this.logLevel = logLevel == null ? LogLevel.ERROR : logLevel;
LogUtil.setupLogger(this.logLevel);
LogUtil.printInfoLog(BaseUtils.parameterizedString(
InfoLogs.CURRENT_LOG_LEVEL.getLog(), String.valueOf(this.logLevel)
));
return this;
}
protected final void addVaultConfigTemplate(V vaultConfig) throws SkyflowException {
LogUtil.printInfoLog(InfoLogs.VALIDATING_VAULT_CONFIG.getLog());
validateVaultConfig(vaultConfig);
V vaultConfigCopy = cloneVaultConfig(vaultConfig);
String vaultId = extractVaultId(vaultConfigCopy);
if (this.vaultConfigMap.containsKey(vaultId)) {
LogUtil.printErrorLog(BaseUtils.parameterizedString(
ErrorLogs.VAULT_CONFIG_EXISTS.getLog(), vaultId
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(),
ErrorMessage.VaultIdAlreadyInConfigList.getMessage());
}
this.vaultConfigMap.put(vaultId, vaultConfigCopy);
onVaultConfigAdded(vaultConfigCopy);
}
protected final void updateVaultConfigTemplate(V vaultConfig) throws SkyflowException {
LogUtil.printInfoLog(InfoLogs.VALIDATING_VAULT_CONFIG.getLog());
validateVaultConfig(vaultConfig);
String vaultId = extractVaultId(vaultConfig);
if (!this.vaultConfigMap.containsKey(vaultId)) {
LogUtil.printErrorLog(BaseUtils.parameterizedString(
ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog(), vaultId
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage());
}
V previousConfig = this.vaultConfigMap.get(vaultId);
V merged = mergeVaultConfig(vaultConfig, previousConfig);
onVaultConfigUpdated(merged);
}
protected final void removeVaultConfigTemplate(String vaultId) throws SkyflowException {
if (!this.vaultConfigMap.containsKey(vaultId)) {
LogUtil.printErrorLog(BaseUtils.parameterizedString(ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog(), vaultId));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage());
}
onVaultConfigRemoved(vaultId);
this.vaultConfigMap.remove(vaultId);
}
protected final void addSkyflowCredentialsTemplate(Credentials credentials) throws SkyflowException {
BaseValidations.validateCredentials(credentials);
Credentials credentialsCopy;
try {
credentialsCopy = (Credentials) credentials.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
this.skyflowCredentials = credentialsCopy;
onCredentialsUpdated(credentialsCopy);
}
protected abstract void validateVaultConfig(V vaultConfig) throws SkyflowException;
@SuppressWarnings("unchecked")
protected final V cloneVaultConfig(V vaultConfig) {
try {
return (V) vaultConfig.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
protected final String extractVaultId(V vaultConfig) {
return vaultConfig.getVaultId();
}
protected final V mergeVaultConfig(V incoming, V existing) {
if (incoming.getEnv() != null) {
existing.setEnv(incoming.getEnv());
}
if (incoming.getClusterId() != null) {
existing.setClusterId(incoming.getClusterId());
}
if (incoming.getCredentials() != null) {
try {
existing.setCredentials((Credentials) incoming.getCredentials().clone());
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
return existing;
}
protected abstract void onVaultConfigAdded(V vaultConfig) throws SkyflowException;
protected abstract void onVaultConfigUpdated(V updatedConfig) throws SkyflowException;
protected abstract void onVaultConfigRemoved(String vaultId) throws SkyflowException;
protected abstract void onCredentialsUpdated(Credentials credentials) throws SkyflowException;
}
}