Skip to content

Commit 2ec2641

Browse files
committed
Cleanup of onboarding and tenant to track all deployments and update
tenant status
1 parent dc31e58 commit 2ec2641

File tree

19 files changed

+591
-241
lines changed

19 files changed

+591
-241
lines changed

functions/onboarding-app-stack-listener/src/main/java/com/amazon/aws/partners/saasfactory/saasboost/OnboardingAppStackListener.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ public Object handleRequest(SNSEvent event, Context context) {
139139
"Tenant Resources Changed",
140140
Map.of("tenantId", tenantId, "resources", Utils.toJson(tenantResource))
141141
);
142+
143+
// Link this pipeline to the stack that created it in Onboarding so we can keep
144+
// track of when all pipeline executions for an onboarding request
145+
Utils.publishEvent(eventBridge, SAAS_BOOST_EVENT_BUS, EVENT_SOURCE,
146+
"Onboarding Deployment Pipeline Created",
147+
Map.of("tenantId", tenantId,
148+
"stackId", stackId,
149+
"stackName", stackName,
150+
"pipeline", codePipeline)
151+
);
142152
}
143153
// } else if ("AWS::CloudFormation::Stack".equals(resourceType) && "rds".equals(logicalId)) {
144154
// //this is the rds sub-stack so get the cluster and instance ids

layers/utils/src/main/java/com/amazon/aws/partners/saasfactory/saasboost/Utils.java

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,11 +246,62 @@ public static String toUpperSnakeCase(String str) {
246246
if (str == null) {
247247
return null;
248248
}
249-
if (isBlank(str)) {
249+
return toSnakeCase(str).toUpperCase();
250+
}
251+
252+
public static String toSnakeCase(String str) {
253+
if (str == null) {
254+
return null;
255+
}
256+
if (str.isBlank()) {
250257
return str;
251258
}
252-
// Don't prefix or suffix with underscore
253-
return str.trim().toUpperCase().replaceAll("\\s+", "_");
259+
if (str.length() == 1) {
260+
return str.toLowerCase();
261+
}
262+
StringBuilder buffer = new StringBuilder();
263+
boolean skip = false;
264+
char[] chars = str.toCharArray();
265+
for (int ch = 0; ch < chars.length; ch++) {
266+
char character = chars[ch];
267+
if (ch == 0) {
268+
buffer.append(Character.toLowerCase(character));
269+
continue;
270+
}
271+
if ('_' == character || '-' == character || ' ' == character) {
272+
buffer.append('_');
273+
skip = true;
274+
continue;
275+
}
276+
if (Character.isLowerCase(character) || Character.isDigit(character)) {
277+
buffer.append(character);
278+
continue;
279+
}
280+
char previous = chars[(ch - 1)];
281+
if (!Character.isLetter(previous) || Character.isLowerCase(previous)) {
282+
if (skip) {
283+
skip = false;
284+
} else {
285+
buffer.append('_');
286+
}
287+
buffer.append(Character.toLowerCase(character));
288+
continue;
289+
}
290+
if (ch < (chars.length - 1)) {
291+
char last = chars[(ch + 1)];
292+
if (Character.isLowerCase(last)) {
293+
if (skip) {
294+
skip = false;
295+
} else {
296+
buffer.append('_');
297+
}
298+
buffer.append(Character.toLowerCase(character));
299+
continue;
300+
}
301+
}
302+
buffer.append(Character.toLowerCase(character));
303+
}
304+
return buffer.toString();
254305
}
255306

256307
public static String randomString(int length) {

layers/utils/src/test/java/com/amazon/aws/partners/saasfactory/saasboost/UtilsTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.amazon.aws.partners.saasfactory.saasboost;
1818

19+
import jdk.jshell.execution.Util;
1920
import org.junit.Test;
2021

2122
import static org.junit.Assert.*;
@@ -37,4 +38,21 @@ public void testRandomString() {
3738
assertTrue("Character " + character + " is legal", legalCharacters.contains(character));
3839
}
3940
}
41+
42+
@Test
43+
public void testToSnakeCase() {
44+
assertNull(Utils.toSnakeCase(null));
45+
assertEquals("", Utils.toSnakeCase(""));
46+
assertEquals(" ", Utils.toSnakeCase(" "));
47+
assertEquals("a", Utils.toSnakeCase("a"));
48+
assertEquals("a", Utils.toSnakeCase("A"));
49+
assertEquals("?", Utils.toSnakeCase("?"));
50+
assertEquals("snake_case", Utils.toSnakeCase("snake_case"));
51+
assertEquals("camel_case", Utils.toSnakeCase("camelCase"));
52+
assertEquals("pascal_case", Utils.toSnakeCase("PascalCase"));
53+
assertEquals("snake_case", Utils.toSnakeCase("Snake Case"));
54+
assertEquals("foo_bar", Utils.toSnakeCase("foo baR"));
55+
assertEquals("foo_bar_baz", Utils.toSnakeCase("fooBarBaz"));
56+
assertEquals("foo_bar_baz", Utils.toSnakeCase("fooBarBAZ"));
57+
}
4058
}

resources/saas-boost-core.yaml

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -659,28 +659,6 @@ Resources:
659659
Value: !Ref Environment
660660
- Key: "BoostService"
661661
Value: "Tenant"
662-
TenantEnableDisableEventRule:
663-
Type: AWS::Events::Rule
664-
Properties:
665-
Name: !Sub sb-${Environment}-tenant-enable-disable
666-
Description: A filter for when a tenant status is updated
667-
EventBusName: !Sub '{{resolve:ssm:/saas-boost/${Environment}/EVENT_BUS}}'
668-
EventPattern:
669-
detail-type:
670-
- Tenant Status Update
671-
source:
672-
- saas-boost
673-
State: ENABLED
674-
Targets:
675-
- Arn: !GetAtt TenantEnableDisableListenerFunction.Arn
676-
Id: TenantEnableDisableListenerFunction
677-
TenantEnableDisableListenerPermission:
678-
Type: AWS::Lambda::Permission
679-
Properties:
680-
Action: lambda:InvokeFunction
681-
FunctionName: !GetAtt TenantEnableDisableListenerFunction.Arn
682-
Principal: events.amazonaws.com
683-
SourceArn: !GetAtt TenantEnableDisableEventRule.Arn
684662
EcsShutdownServicesExecRole:
685663
Type: AWS::IAM::Role
686664
Properties:

services/onboarding-service/src/main/java/com/amazon/aws/partners/saasfactory/saasboost/Onboarding.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package com.amazon.aws.partners.saasfactory.saasboost;
1818

19-
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
20-
2119
import java.time.LocalDateTime;
2220
import java.util.ArrayList;
2321
import java.util.List;
@@ -33,7 +31,7 @@ public class Onboarding {
3331
private UUID tenantId;
3432
private OnboardingRequest request;
3533
private List<OnboardingStack> stacks = new ArrayList<>();
36-
private String zipFileUrl;
34+
private String zipFile;
3735

3836
public Onboarding() {
3937
}
@@ -46,14 +44,6 @@ public void setId(UUID id) {
4644
this.id = id;
4745
}
4846

49-
public void setZipFileUrl(String zipFileUrl) {
50-
this.zipFileUrl = zipFileUrl;
51-
}
52-
53-
public String getZipFileUrl() {
54-
return zipFileUrl;
55-
}
56-
5747
public LocalDateTime getCreated() {
5848
return created;
5949
}
@@ -98,6 +88,14 @@ public List<OnboardingStack> getStacks() {
9888
return stacks;
9989
}
10090

91+
public void setZipFile(String zipFile) {
92+
this.zipFile = zipFile;
93+
}
94+
95+
public String getZipFile() {
96+
return zipFile;
97+
}
98+
10199
public void setStacks(List<OnboardingStack> stacks) {
102100
this.stacks = stacks != null ? new ArrayList<>(stacks) : new ArrayList<>();
103101
}
@@ -124,6 +122,17 @@ public boolean baseStacksComplete() {
124122
return stacksComplete(true);
125123
}
126124

125+
public boolean stacksDeployed() {
126+
boolean deployed = true;
127+
for (OnboardingStack stack : getStacks()) {
128+
if (!stack.isDeployed()) {
129+
deployed = false;
130+
break;
131+
}
132+
}
133+
return deployed;
134+
}
135+
127136
protected boolean stacksComplete(boolean baseStacks) {
128137
boolean complete = false;
129138
if (!getStacks().isEmpty()) {

services/onboarding-service/src/main/java/com/amazon/aws/partners/saasfactory/saasboost/OnboardingEvent.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public enum OnboardingEvent {
2727
ONBOARDING_STACK_STATUS_CHANGED("Onboarding Stack Status Changed"),
2828
ONBOARDING_BASE_PROVISIONED("Onboarding Base Provisioned"),
2929
ONBOARDING_PROVISIONED("Onboarding Provisioned"),
30+
ONBOARDING_DEPLOYMENT_PIPELINE_CREATED("Onboarding Deployment Pipeline Created"),
3031
ONBOARDING_DEPLOYMENT_PIPELINE_CHANGED("Onboarding Deployment Pipeline Change"),
3132
ONBOARDING_DEPLOYED("Onboarding Deployed"),
3233
ONBOARDING_COMPLETED("Onboarding Completed"),

0 commit comments

Comments
 (0)