Skip to content

Commit ec2c2fb

Browse files
zachsmith1Zach Smith
andauthored
feat(provider/cf): add stack property for buildpack lifecycle (#4713)
Co-authored-by: Zach Smith <zachsmith@Zachs-MBP-2.attlocal.net>
1 parent 62450c9 commit ec2c2fb

File tree

7 files changed

+84
-17
lines changed

7 files changed

+84
-17
lines changed

clouddriver/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/Applications.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.v3.*;
3535
import com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.v3.Package;
3636
import com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.v3.Process;
37+
import com.netflix.spinnaker.clouddriver.cloudfoundry.deploy.description.DeployCloudFoundryServerGroupDescription;
3738
import com.netflix.spinnaker.clouddriver.cloudfoundry.model.*;
3839
import com.netflix.spinnaker.clouddriver.model.HealthState;
3940
import java.io.File;
@@ -534,7 +535,7 @@ public void deleteAppInstance(String guid, String index) throws CloudFoundryApiE
534535
public CloudFoundryServerGroup createApplication(
535536
String appName,
536537
CloudFoundrySpace space,
537-
List<String> buildpacks,
538+
DeployCloudFoundryServerGroupDescription.ApplicationAttributes applicationAttributes,
538539
@Nullable Map<String, String> environmentVariables)
539540
throws CloudFoundryApiException {
540541
Map<String, ToOneRelationship> relationships = new HashMap<>();
@@ -544,7 +545,7 @@ public CloudFoundryServerGroup createApplication(
544545
() ->
545546
api.createApplication(
546547
new CreateApplication(
547-
appName, relationships, environmentVariables, buildpacks)))
548+
appName, relationships, environmentVariables, applicationAttributes)))
548549
.map(this::map)
549550
.orElseThrow(
550551
() ->

clouddriver/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/model/v3/CreateApplication.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.v3;
1818

1919
import com.fasterxml.jackson.annotation.JsonInclude;
20-
import java.util.Collections;
21-
import java.util.List;
20+
import com.google.common.collect.ImmutableMap;
21+
import com.netflix.spinnaker.clouddriver.cloudfoundry.deploy.description.DeployCloudFoundryServerGroupDescription;
2222
import java.util.Map;
2323
import javax.annotation.Nullable;
2424
import lombok.AllArgsConstructor;
@@ -38,21 +38,36 @@ public CreateApplication(
3838
String name,
3939
Map<String, ToOneRelationship> relationships,
4040
@Nullable Map<String, String> environmentVariables,
41-
@Nullable List<String> buildpacks) {
41+
DeployCloudFoundryServerGroupDescription.ApplicationAttributes applicationAttributes) {
4242
this.name = name;
4343
this.relationships = relationships;
4444
this.environmentVariables = environmentVariables;
45-
this.lifecycle = buildpacks != null ? new BuildpackLifecycle(buildpacks) : null;
45+
this.lifecycle =
46+
applicationAttributes.getBuildpacks() != null || applicationAttributes.getStack() != null
47+
? new BuildpackLifecycle(applicationAttributes)
48+
: null;
4649
}
4750

4851
@AllArgsConstructor
4952
@Getter
5053
public static class BuildpackLifecycle {
5154
private String type = "buildpack";
52-
private Map<String, List<String>> data;
55+
private Map<String, Object> data;
5356

54-
BuildpackLifecycle(List<String> buildpacks) {
55-
this.data = Collections.singletonMap("buildpacks", buildpacks);
57+
BuildpackLifecycle(
58+
DeployCloudFoundryServerGroupDescription.ApplicationAttributes applicationAttributes) {
59+
this.data =
60+
new BuildpackLifecycleBuilder<String, Object>()
61+
.putIfValueNotNull("buildpacks", applicationAttributes.getBuildpacks())
62+
.putIfValueNotNull("stack", applicationAttributes.getStack())
63+
.build();
64+
}
65+
}
66+
67+
static class BuildpackLifecycleBuilder<K, V> extends ImmutableMap.Builder<K, V> {
68+
public BuildpackLifecycleBuilder<K, V> putIfValueNotNull(K key, V value) {
69+
if (value != null) super.put(key, value);
70+
return this;
5671
}
5772
}
5873
}

clouddriver/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/converters/DeployCloudFoundryServerGroupAtomicOperationConverter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ DeployCloudFoundryServerGroupDescription.ApplicationAttributes convertManifest(
150150
.flatMap(route -> route.values().stream())
151151
.collect(toList()));
152152
attrs.setEnv(app.getEnv());
153+
attrs.setStack(app.getStack());
153154
return attrs;
154155
})
155156
.get();
@@ -178,5 +179,7 @@ private static class CloudFoundryManifest {
178179
@Nullable private List<Map<String, String>> routes;
179180

180181
@Nullable private Map<String, String> env;
182+
183+
@Nullable private String stack;
181184
}
182185
}

clouddriver/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/description/DeployCloudFoundryServerGroupDescription.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,7 @@ public static class ApplicationAttributes {
6262
@Nullable private Map<String, String> env;
6363

6464
@Nullable private List<String> services;
65+
66+
@Nullable private String stack;
6567
}
6668
}

clouddriver/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/DeployCloudFoundryServerGroupAtomicOperation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ private static CloudFoundryServerGroup createApplication(
190190
.createApplication(
191191
description.getServerGroupName(),
192192
description.getSpace(),
193-
description.getApplicationAttributes().getBuildpacks(),
193+
description.getApplicationAttributes(),
194194
getEnvironmentVars(description));
195195
getTask()
196196
.updateStatus(

clouddriver/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/model/v3/CreateApplicationTest.java

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
2020

21-
import java.util.Arrays;
21+
import com.google.common.collect.ImmutableList;
22+
import com.google.common.collect.ImmutableMap;
23+
import com.netflix.spinnaker.clouddriver.cloudfoundry.deploy.description.DeployCloudFoundryServerGroupDescription;
2224
import java.util.Collections;
23-
import java.util.List;
2425
import java.util.Map;
2526
import org.junit.jupiter.api.Test;
2627

@@ -31,11 +32,50 @@ void getLifecycleShouldReturnMultipleBuildpacks() {
3132
ToOneRelationship toOneRelationship = new ToOneRelationship(new Relationship("space-guid"));
3233
Map<String, ToOneRelationship> relationships =
3334
Collections.singletonMap("relationship", toOneRelationship);
34-
List<String> buildpacks = Arrays.asList("buildpackOne", "buildpackTwo");
35+
DeployCloudFoundryServerGroupDescription.ApplicationAttributes applicationAttributes =
36+
new DeployCloudFoundryServerGroupDescription.ApplicationAttributes();
37+
applicationAttributes.setBuildpacks(ImmutableList.of("buildpackOne", "buildpackTwo"));
3538
CreateApplication createApplication =
36-
new CreateApplication("some-application", relationships, null, buildpacks);
39+
new CreateApplication("some-application", relationships, null, applicationAttributes);
3740

38-
assertThat(createApplication.getLifecycle().getData().get("buildpacks")).isEqualTo(buildpacks);
41+
assertThat(createApplication.getLifecycle().getData().get("buildpacks"))
42+
.isEqualTo(applicationAttributes.getBuildpacks());
43+
}
44+
45+
@Test
46+
void getLifecycleShouldReturnWithBuildpackAndWithStack() {
47+
ToOneRelationship toOneRelationship = new ToOneRelationship(new Relationship("space-guid"));
48+
Map<String, ToOneRelationship> relationships =
49+
Collections.singletonMap("relationship", toOneRelationship);
50+
DeployCloudFoundryServerGroupDescription.ApplicationAttributes applicationAttributes =
51+
new DeployCloudFoundryServerGroupDescription.ApplicationAttributes();
52+
applicationAttributes.setBuildpacks(ImmutableList.of("buildpackOne"));
53+
applicationAttributes.setStack("cflinuxfs3");
54+
CreateApplication createApplication =
55+
new CreateApplication("some-application", relationships, null, applicationAttributes);
56+
57+
Map<String, Object> data =
58+
ImmutableMap.of(
59+
"buildpacks", applicationAttributes.getBuildpacks(),
60+
"stack", applicationAttributes.getStack());
61+
62+
assertThat(createApplication.getLifecycle().getData()).isEqualTo(data);
63+
}
64+
65+
@Test
66+
void getLifecycleShouldReturnWithoutBuildpackAndWithStack() {
67+
ToOneRelationship toOneRelationship = new ToOneRelationship(new Relationship("space-guid"));
68+
Map<String, ToOneRelationship> relationships =
69+
Collections.singletonMap("relationship", toOneRelationship);
70+
DeployCloudFoundryServerGroupDescription.ApplicationAttributes applicationAttributes =
71+
new DeployCloudFoundryServerGroupDescription.ApplicationAttributes();
72+
applicationAttributes.setStack("cflinuxfs3");
73+
CreateApplication createApplication =
74+
new CreateApplication("some-application", relationships, null, applicationAttributes);
75+
76+
Map<String, Object> data = ImmutableMap.of("stack", applicationAttributes.getStack());
77+
78+
assertThat(createApplication.getLifecycle().getData()).isEqualTo(data);
3979
}
4080

4181
@Test
@@ -44,8 +84,10 @@ void getLifecycleShouldReturnNull() {
4484
new ToOneRelationship(new Relationship("relationship-guid"));
4585
Map<String, ToOneRelationship> relationships =
4686
Collections.singletonMap("relationship", toOneRelationship);
87+
DeployCloudFoundryServerGroupDescription.ApplicationAttributes applicationAttributes =
88+
new DeployCloudFoundryServerGroupDescription.ApplicationAttributes();
4789
CreateApplication createApplication =
48-
new CreateApplication("some-application", relationships, null, null);
90+
new CreateApplication("some-application", relationships, null, applicationAttributes);
4991

5092
assertThat(createApplication.getLifecycle()).isNull();
5193
}

clouddriver/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/DeployCloudFoundryServerGroupAtomicOperationTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,16 @@ void executeOperationWithNoStartFlag() {
142142

143143
private void verifyInOrder(final Applications apps, Supplier<VerificationMode> calls) {
144144
final InOrder inOrder = Mockito.inOrder(apps, cloudFoundryClient.getServiceInstances());
145+
DeployCloudFoundryServerGroupDescription.ApplicationAttributes applicationAttributes =
146+
new DeployCloudFoundryServerGroupDescription.ApplicationAttributes();
147+
applicationAttributes.setBuildpacks(
148+
io.vavr.collection.List.of("buildpack1", "buildpack2").asJava());
145149
inOrder
146150
.verify(apps)
147151
.createApplication(
148152
"app1-stack1-detail1-v000",
149153
CloudFoundrySpace.builder().id("space1Id").name("space1").build(),
150-
io.vavr.collection.List.of("buildpack1", "buildpack2").asJava(),
154+
getDeployCloudFoundryServerGroupDescription(true).getApplicationAttributes(),
151155
HashMap.of("token", "ASDF").toJavaMap());
152156
inOrder.verify(apps).uploadPackageBits(eq("serverGroupId_package"), any());
153157
inOrder.verify(apps).createBuild("serverGroupId_package");

0 commit comments

Comments
 (0)