Skip to content

Commit 14bd217

Browse files
authored
refactor(api): Add a marker interface that could be expanded eventually for AtomicOperation inputs.Also, (spinnaker#5311)
add some stronger generics.
1 parent 3ba8321 commit 14bd217

File tree

20 files changed

+53
-31
lines changed

20 files changed

+53
-31
lines changed

clouddriver-api/src/main/java/com/netflix/spinnaker/clouddriver/orchestration/AtomicOperationConverter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,5 @@ public interface AtomicOperationConverter extends VersionedCloudProviderOperatio
4343
* @param input
4444
* @return instance of an operation description object
4545
*/
46-
Object convertDescription(Map<String, Object> input);
46+
OperationDescription convertDescription(Map<String, Object> input);
4747
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.netflix.spinnaker.clouddriver.orchestration;
2+
3+
/** Marker interface for inputs to an {@link AtomicOperation}. */
4+
public interface OperationDescription {}

clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/description/AllowLaunchDescription.groovy

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.netflix.spinnaker.clouddriver.aws.deploy.description
1818

19+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription
20+
1921
class AllowLaunchDescription extends AbstractAmazonCredentialsDescription {
2022
String targetAccount
2123
String amiName

clouddriver-azure/src/main/groovy/com/netflix/spinnaker/clouddriver/azure/resources/common/AzureResourceOpsDescription.groovy

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ package com.netflix.spinnaker.clouddriver.azure.resources.common
1919
import com.fasterxml.jackson.databind.DeserializationFeature
2020
import com.fasterxml.jackson.databind.ObjectMapper
2121
import com.netflix.spinnaker.clouddriver.azure.security.AzureCredentials
22+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription
2223

23-
class AzureResourceOpsDescription {
24+
class AzureResourceOpsDescription implements OperationDescription {
2425
static ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
2526

2627
String name

clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/core/NoopAtomicOperationConverter.groovy

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.netflix.spinnaker.clouddriver.core
1818

1919
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperation
2020
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperationConverter
21+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription
2122
import groovy.util.logging.Slf4j
2223
import org.springframework.stereotype.Component
2324

@@ -35,7 +36,7 @@ class NoopAtomicOperationConverter implements AtomicOperationConverter {
3536
}
3637

3738
@Override
38-
Object convertDescription(Map input) {
39+
OperationDescription convertDescription(Map input) {
3940
return null
4041
}
4142
}

clouddriver-core/src/main/java/com/netflix/spinnaker/clouddriver/deploy/DefaultDescriptionAuthorizer.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.netflix.spinnaker.clouddriver.deploy;
1818

19+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription;
1920
import org.springframework.validation.Errors;
2021

2122
public class DefaultDescriptionAuthorizer implements DescriptionAuthorizer {
@@ -27,7 +28,7 @@ public DefaultDescriptionAuthorizer(DescriptionAuthorizerService descriptionAuth
2728
}
2829

2930
@Override
30-
public void authorize(Object description, Errors errors) {
31+
public void authorize(OperationDescription description, Errors errors) {
3132
descriptionAuthorizerService.authorize(description, errors);
3233
}
3334
}

clouddriver-core/src/main/java/com/netflix/spinnaker/clouddriver/deploy/DeployDescription.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.netflix.spinnaker.clouddriver.deploy;
1818

19+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription;
1920
import com.netflix.spinnaker.clouddriver.orchestration.events.OperationEvent;
2021
import java.util.Collection;
2122
import java.util.Collections;
@@ -25,7 +26,7 @@
2526
*
2627
* @see DeployHandler
2728
*/
28-
public interface DeployDescription {
29+
public interface DeployDescription extends OperationDescription {
2930
default Collection<OperationEvent> getEvents() {
3031
return Collections.emptyList();
3132
}

clouddriver-core/src/main/java/com/netflix/spinnaker/clouddriver/deploy/DescriptionAuthorizer.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.netflix.spinnaker.clouddriver.deploy;
22

3+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription;
34
import org.springframework.validation.Errors;
45

56
/** Authorizes atomic operation description objects. */
@@ -11,5 +12,5 @@ default boolean supports(Object description) {
1112
}
1213

1314
/** @param description - The atomic operation description object. */
14-
void authorize(Object description, Errors errors);
15+
void authorize(OperationDescription description, Errors errors);
1516
}

clouddriver-core/src/main/java/com/netflix/spinnaker/clouddriver/orchestration/AtomicOperationDescriptionPreProcessor.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
public interface AtomicOperationDescriptionPreProcessor {
3030
boolean supports(Class descriptionClass);
3131

32-
Map process(Map description);
32+
Map<String, Object> process(Map<String, Object> description);
3333

34-
default <T> T mapTo(ObjectMapper objectMapper, Map description, Class<T> clazz)
34+
default <T> T mapTo(ObjectMapper objectMapper, Map<String, Object> description, Class<T> clazz)
3535
throws IOException {
3636
ObjectNode objectNode = objectMapper.valueToTree(description);
3737
return objectMapper.readValue(new TreeTraversingParser(objectNode, objectMapper), clazz);

clouddriver-core/src/main/java/com/netflix/spinnaker/clouddriver/orchestration/OperationsService.java

+11-9
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,14 @@ public OperationsService(
9797
}
9898

9999
@Nonnull
100-
public List<AtomicOperation> collectAtomicOperations(@Nonnull List<Map<String, Map>> inputs) {
100+
public List<AtomicOperation> collectAtomicOperations(
101+
@Nonnull List<Map<String, Map<String, Object>>> inputs) {
101102
return collectAtomicOperations(null, inputs);
102103
}
103104

104105
@Nonnull
105106
public List<AtomicOperation> collectAtomicOperations(
106-
@Nullable String cloudProvider, @Nonnull List<Map<String, Map>> inputs) {
107+
@Nullable String cloudProvider, @Nonnull List<Map<String, Map<String, Object>>> inputs) {
107108
List<AtomicOperationBindingResult> results = convert(cloudProvider, inputs);
108109

109110
List<AtomicOperation> atomicOperations = new ArrayList<>();
@@ -119,21 +120,21 @@ public List<AtomicOperation> collectAtomicOperations(
119120
}
120121

121122
private List<AtomicOperationBindingResult> convert(
122-
@Nullable String cloudProvider, @Nonnull List<Map<String, Map>> inputs) {
123+
@Nullable String cloudProvider, @Nonnull List<Map<String, Map<String, Object>>> inputs) {
123124

124125
String username = AuthenticatedRequest.getSpinnakerUser().orElse("unknown");
125126
List<String> allowedAccounts =
126127
COMMA_SPLITTER.splitToList(AuthenticatedRequest.getSpinnakerAccounts().orElse(""));
127128

128-
List<Object> descriptions = new ArrayList<>();
129+
List<OperationDescription> descriptions = new ArrayList<>();
129130
return inputs.stream()
130131
.flatMap(
131132
input ->
132133
input.entrySet().stream()
133134
.map(
134135
e -> {
135136
final String descriptionName = e.getKey();
136-
final Map descriptionInput = e.getValue();
137+
final Map<String, Object> descriptionInput = e.getValue();
137138
final OperationInput operationInput =
138139
objectMapper.convertValue(descriptionInput, OperationInput.class);
139140
final String provider =
@@ -146,13 +147,14 @@ private List<AtomicOperationBindingResult> convert(
146147

147148
// TODO(rz): What if a preprocessor fails due to a downstream error? How
148149
// does this affect retrying?
149-
Map processedInput =
150+
Map<String, Object> processedInput =
150151
processDescriptionInput(
151152
atomicOperationDescriptionPreProcessors,
152153
converter,
153154
descriptionInput);
154155

155-
Object description = converter.convertDescription(processedInput);
156+
OperationDescription description =
157+
converter.convertDescription(processedInput);
156158

157159
descriptions.add(description);
158160

@@ -314,10 +316,10 @@ private Collection<String> collectErrors(Errors errors) {
314316
* <p>Which preprocessors are used is determined by doing some reflection on the
315317
* AtomicOperationConverter's return type.
316318
*/
317-
private static Map processDescriptionInput(
319+
private static Map<String, Object> processDescriptionInput(
318320
Collection<AtomicOperationDescriptionPreProcessor> descriptionPreProcessors,
319321
AtomicOperationConverter converter,
320-
Map descriptionInput) {
322+
Map<String, Object> descriptionInput) {
321323

322324
Method convertDescriptionMethod;
323325
try {

clouddriver-core/src/test/groovy/com/netflix/spinnaker/clouddriver/orchestration/AnnotationsBasedAtomicOperationsRegistrySpec.groovy

+3-3
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ class AnnotationsBasedAtomicOperationsRegistrySpec extends Specification {
164164
return null
165165
}
166166
@Override
167-
Object convertDescription(Map input) {
167+
OperationDescription convertDescription(Map input) {
168168
return null
169169
}
170170
}
@@ -183,7 +183,7 @@ class AnnotationsBasedAtomicOperationsRegistrySpec extends Specification {
183183
return null
184184
}
185185
@Override
186-
Object convertDescription(Map input) {
186+
OperationDescription convertDescription(Map input) {
187187
return null
188188
}
189189
@Override
@@ -199,7 +199,7 @@ class AnnotationsBasedAtomicOperationsRegistrySpec extends Specification {
199199
return null
200200
}
201201
@Override
202-
Object convertDescription(Map input) {
202+
OperationDescription convertDescription(Map input) {
203203
return null
204204
}
205205
@Override

clouddriver-core/src/test/groovy/com/netflix/spinnaker/clouddriver/orchestration/OperationsServiceSpec.groovy

+2-2
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class OperationsServiceSpec extends Specification {
143143
new Op1()
144144
}
145145

146-
Object convertDescription(Map input) {
146+
OperationDescription convertDescription(Map input) {
147147
return null
148148
}
149149
}
@@ -153,7 +153,7 @@ class OperationsServiceSpec extends Specification {
153153
new Op2()
154154
}
155155

156-
Object convertDescription(Map input) {
156+
OperationDescription convertDescription(Map input) {
157157
return null
158158
}
159159
}

clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/clouddriver/elasticsearch/descriptions/DeleteEntityTagsDescription.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
package com.netflix.spinnaker.clouddriver.elasticsearch.descriptions;
1818

1919
import com.fasterxml.jackson.annotation.JsonProperty;
20+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription;
2021
import com.netflix.spinnaker.clouddriver.security.resources.NonCredentialed;
2122
import java.util.List;
2223

23-
public class DeleteEntityTagsDescription implements NonCredentialed {
24+
public class DeleteEntityTagsDescription implements NonCredentialed, OperationDescription {
2425
@JsonProperty private String id;
2526

2627
@JsonProperty private List<String> tags;

clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/deploy/converters/ResizeGoogleServerGroupAtomicOperationConverter.groovy

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.netflix.spinnaker.clouddriver.google.model.GoogleServerGroup
2828
import com.netflix.spinnaker.clouddriver.google.provider.view.GoogleClusterProvider
2929
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperation
3030
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperations
31+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription
3132
import com.netflix.spinnaker.clouddriver.security.AbstractAtomicOperationsCredentialsSupport
3233
import org.springframework.beans.factory.annotation.Autowired
3334
import org.springframework.stereotype.Component
@@ -53,7 +54,7 @@ class ResizeGoogleServerGroupAtomicOperationConverter extends AbstractAtomicOper
5354
}
5455
}
5556

56-
def convertDescription(Map input, GoogleAutoscalingPolicy autoscalingPolicy) {
57+
OperationDescription convertDescription(Map input, GoogleAutoscalingPolicy autoscalingPolicy) {
5758
if (autoscalingPolicy) {
5859
UpsertGoogleAutoscalingPolicyDescription upsertGoogleAutoscalingPolicyDescription =
5960
GoogleAtomicOperationConverterHelper.convertDescription(input, this, UpsertGoogleAutoscalingPolicyDescription)
@@ -79,7 +80,7 @@ class ResizeGoogleServerGroupAtomicOperationConverter extends AbstractAtomicOper
7980
}
8081

8182
@Override
82-
def convertDescription(Map input) {
83+
OperationDescription convertDescription(Map input) {
8384
return convertDescription(input, resolveServerGroup(input)?.autoscalingPolicy)
8485
}
8586

clouddriver-oracle/src/main/groovy/com/netflix/spinnaker/clouddriver/oracle/deploy/converter/NoOpOracleAtomicOperationConverter.groovy

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ package com.netflix.spinnaker.clouddriver.oracle.deploy.converter
1111
import com.netflix.spinnaker.clouddriver.oracle.OracleOperation
1212
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperation
1313
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperations
14+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription
1415
import com.netflix.spinnaker.clouddriver.security.AbstractAtomicOperationsCredentialsSupport
1516
import org.springframework.stereotype.Component
1617

@@ -28,7 +29,7 @@ class NoOpOracleAtomicOperationConverter extends AbstractAtomicOperationsCredent
2829
}
2930

3031
@Override
31-
Object convertDescription(Map input) {
32+
OperationDescription convertDescription(Map input) {
3233
return null
3334
}
3435
}

clouddriver-security/src/main/java/com/netflix/spinnaker/clouddriver/security/resources/AccountNameable.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@
1616

1717
package com.netflix.spinnaker.clouddriver.security.resources;
1818

19+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription;
1920
import com.netflix.spinnaker.clouddriver.security.config.SecurityConfig;
2021

2122
/** Denotes an operation description operates on a specific account. */
22-
public interface AccountNameable {
23+
public interface AccountNameable extends OperationDescription {
2324
String getAccount();
2425

2526
/**

clouddriver-security/src/main/java/com/netflix/spinnaker/clouddriver/security/resources/ApplicationNameable.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616

1717
package com.netflix.spinnaker.clouddriver.security.resources;
1818

19+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription;
1920
import java.util.Collection;
2021

2122
/** Denotes an operation description operates on one or more specific application resources. */
22-
public interface ApplicationNameable {
23+
public interface ApplicationNameable extends OperationDescription {
2324
Collection<String> getApplications();
2425
}

clouddriver-security/src/main/java/com/netflix/spinnaker/clouddriver/security/resources/NonCredentialed.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
package com.netflix.spinnaker.clouddriver.security.resources;
1818

19+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription;
20+
1921
/**
2022
* Marker interface indicating that a description does not have account-level credentials specified.
2123
*/
22-
public interface NonCredentialed {}
24+
public interface NonCredentialed extends OperationDescription {}

clouddriver-web/src/test/groovy/com/netflix/spinnaker/clouddriver/controllers/FeaturesControllerSpec.groovy

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.netflix.spinnaker.clouddriver.elasticsearch.converters.UpsertEntityTa
2121
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperation
2222
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperationConverter
2323
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperations
24+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription
2425
import org.springframework.stereotype.Component
2526
import spock.lang.Specification
2627

@@ -60,7 +61,7 @@ class FeaturesControllerSpec extends Specification {
6061
}
6162

6263
@Override
63-
Object convertDescription(Map input) {
64+
OperationDescription convertDescription(Map input) {
6465
throw new UnsupportedOperationException()
6566
}
6667
}

clouddriver-yandex/src/test/java/com/netflix/spinnaker/clouddriver/yandex/deploy/TestCredentialSupport.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.netflix.spinnaker.clouddriver.yandex.deploy;
1818

1919
import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperation;
20+
import com.netflix.spinnaker.clouddriver.orchestration.OperationDescription;
2021
import com.netflix.spinnaker.clouddriver.security.AbstractAtomicOperationsCredentialsSupport;
2122
import java.util.Map;
2223
import javax.annotation.Nullable;
@@ -29,7 +30,7 @@ public AtomicOperation<Void> convertOperation(Map<String, Object> input) {
2930
}
3031

3132
@Override
32-
public Object convertDescription(Map<String, Object> input) {
33+
public OperationDescription convertDescription(Map<String, Object> input) {
3334
throw new UnsupportedOperationException();
3435
}
3536
}

0 commit comments

Comments
 (0)