Skip to content

Commit 5dab691

Browse files
author
g4ze
committed
last addons left
1 parent fbb844b commit 5dab691

File tree

5 files changed

+123
-26
lines changed

5 files changed

+123
-26
lines changed

main

1.66 MB
Binary file not shown.

pkg/controllers/deploy-container.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"github.com/g4ze/byoc/pkg/core"
66
)
77

8-
func Deploy_container(UserName string, Image string, Ports int32, Environment map[string]string) {
8+
func Deploy_container(UserName string, Image string, Ports int32, Environment map[string]string) string {
99
core.CreateCluster(UserName)
1010
// KeyValuePair
1111
Environment2 := func() []types.KeyValuePair {
@@ -19,6 +19,10 @@ func Deploy_container(UserName string, Image string, Ports int32, Environment ma
1919
return Environment2
2020
}()
2121
core.CreateTaskDefinition(UserName, Image, Ports, Environment2)
22-
core.CreateService(UserName, Image, Ports, Environment2)
23-
// CreateTaskDefinition(UserName, Image, Port, Environment)
22+
lbDNS := core.CreateService(UserName, Image, Ports, Environment2)
23+
if *lbDNS == "OK" {
24+
return "OK"
25+
} else {
26+
return *lbDNS
27+
}
2428
}

pkg/core/create-service.go

Lines changed: 114 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
"github.com/joho/godotenv"
1717
)
1818

19-
func CreateService(UserName string, Image string, Port int32, Environment []types.KeyValuePair) {
19+
func CreateService(UserName string, Image string, Port int32, Environment []types.KeyValuePair) *string {
2020
err := godotenv.Load()
2121
if err != nil {
2222
log.Fatalf("Error loading .env file: %v", err)
@@ -28,40 +28,64 @@ func CreateService(UserName string, Image string, Port int32, Environment []type
2828

2929
// Create ECS client
3030
svc := ecs.NewFromConfig(cfg)
31-
32-
// Generate names
31+
sess := session.Must(session.NewSession())
32+
elbSvc := elbv2.New(sess)
3333
containerName := generateName(UserName, Image, "container")
3434
serviceName := generateName(UserName, Image, "service")
35-
loadBalancerName := generateName(UserName, "Image", "lb")
35+
// loadBalancerName := generateName(UserName, "Image", "lb")
3636
taskName := generateName(UserName, Image, "task")
37-
// Create target group
38-
// targetGroupArn, err := createTargetGroup(UserName, Image)
37+
if serviceExists(svc, serviceName, UserName) {
38+
log.Printf("Service %s already exists. Skipping creation.", serviceName)
39+
_, err := svc.UpdateService(context.TODO(), &ecs.UpdateServiceInput{
40+
Service: &serviceName,
41+
Cluster: &UserName,
42+
ForceNewDeployment: true,
43+
DesiredCount: aws.Int32(2),
44+
})
45+
if err != nil {
46+
log.Fatalf("Unable to update service: %v", err)
47+
}
48+
return aws.String("OK")
49+
}
50+
51+
loadBalancerArn, lbdns, err := createLoadBalancer(elbSvc, UserName, Image)
52+
if err != nil {
53+
log.Fatalf("Failed to create load balancer: %v", err)
54+
}
55+
targetGroupArn, err := createTargetGroup(UserName, Image)
3956
if err != nil {
4057
log.Fatalf("Failed to create target group: %v", err)
4158
}
59+
err = createListener(elbSvc, loadBalancerArn, targetGroupArn)
60+
if err != nil {
61+
log.Fatalf("Failed to create listener: %v", err)
62+
}
63+
// Generate names
4264

4365
serviceInput := &ecs.CreateServiceInput{
4466
ServiceName: &serviceName,
4567
Cluster: &UserName,
46-
DesiredCount: aws.Int32(0),
68+
DesiredCount: aws.Int32(2),
4769
LaunchType: types.LaunchTypeFargate,
4870
LoadBalancers: []types.LoadBalancer{
4971
{
50-
51-
LoadBalancerName: &loadBalancerName,
52-
ContainerName: &containerName,
53-
ContainerPort: &Port,
72+
TargetGroupArn: targetGroupArn,
73+
ContainerName: &containerName,
74+
ContainerPort: &Port,
5475
},
5576
},
5677
NetworkConfiguration: &types.NetworkConfiguration{
5778
AwsvpcConfiguration: &types.AwsVpcConfiguration{
5879
Subnets: []string{
59-
os.Getenv("SUBNET1"),
60-
os.Getenv("SUBNET2"),
61-
os.Getenv("SUBNET3"),
80+
// os.Getenv("SUBNET1"),
81+
// os.Getenv("SUBNET2"),
82+
// os.Getenv("SUBNET3"),
83+
"subnet-03f664a0d4fe40293",
84+
"subnet-01850c7c6f49dfb7f",
85+
"subnet-0450df2a14564e3d5",
6286
},
6387
AssignPublicIp: types.AssignPublicIpEnabled,
64-
SecurityGroups: []string{"sg-0a9330b2203aac089"},
88+
SecurityGroups: []string{"sg-0d1526e6316cb2abf"},
6589
},
6690
},
6791
SchedulingStrategy: types.SchedulingStrategyReplica,
@@ -80,12 +104,13 @@ func CreateService(UserName string, Image string, Port int32, Environment []type
80104
}
81105

82106
log.Printf("Service created with status: %v", *resp.Service.Status)
107+
return lbdns
83108
}
84109

85110
func generateName(UserName string, Image, suffix string) string {
86111
return UserName + "-" + strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(Image, "/", "-"), ".", "-"), ":", "-") + "-" + suffix
87112
}
88-
func createTargetGroup(UserName string, Image string) (*string, error) {
113+
func createTargetGroup(_ string, Image string) (*string, error) {
89114
targetGroupName := strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(Image, "/", "-"), ".", "-"), ":", "-") + "-" + "tg"
90115

91116
// Create ELBv2 client
@@ -112,6 +137,78 @@ func createTargetGroup(UserName string, Image string) (*string, error) {
112137
if len(createResp.TargetGroups) == 0 {
113138
return nil, fmt.Errorf("no target groups created")
114139
}
115-
140+
log.Printf("TG CREATED")
116141
return createResp.TargetGroups[0].TargetGroupArn, nil
117142
}
143+
func createLoadBalancer(elbSvc *elbv2.ELBV2, _ string, Image string) (*string, *string, error) {
144+
loadBalancerName := strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(Image, "/", "-"), ".", "-"), ":", "-") + "-" + "lb"
145+
146+
subnets := []*string{
147+
aws.String(os.Getenv("SUBNET1")),
148+
aws.String(os.Getenv("SUBNET2")),
149+
aws.String(os.Getenv("SUBNET3")),
150+
}
151+
152+
createInput := &elbv2.CreateLoadBalancerInput{
153+
Name: aws.String(loadBalancerName),
154+
Subnets: subnets,
155+
SecurityGroups: []*string{aws.String("sg-0a9330b2203aac089")},
156+
Scheme: aws.String("internet-facing"),
157+
Type: aws.String("application"),
158+
}
159+
160+
createResp, err := elbSvc.CreateLoadBalancer(createInput)
161+
if err != nil {
162+
log.Fatal(err)
163+
}
164+
165+
if len(createResp.LoadBalancers) == 0 {
166+
log.Fatal("No LB created")
167+
}
168+
log.Println("LB CREATED")
169+
lbdns := *createResp.LoadBalancers[0].DNSName
170+
log.Printf("LB public DNS %v", lbdns)
171+
return createResp.LoadBalancers[0].LoadBalancerArn, &lbdns, nil
172+
}
173+
174+
func createListener(elbSvc *elbv2.ELBV2, loadBalancerArn *string, targetGroupArn *string) error {
175+
listenerInput := &elbv2.CreateListenerInput{
176+
LoadBalancerArn: loadBalancerArn,
177+
Protocol: aws.String("HTTP"),
178+
Port: aws.Int64(80),
179+
DefaultActions: []*elbv2.Action{
180+
{
181+
Type: aws.String("forward"),
182+
ForwardConfig: &elbv2.ForwardActionConfig{
183+
TargetGroups: []*elbv2.TargetGroupTuple{
184+
{
185+
TargetGroupArn: targetGroupArn,
186+
},
187+
},
188+
},
189+
},
190+
},
191+
}
192+
193+
_, err := elbSvc.CreateListener(listenerInput)
194+
return err
195+
}
196+
func serviceExists(svc *ecs.Client, serviceName string, clusterName string) bool {
197+
input := &ecs.DescribeServicesInput{
198+
Services: []string{serviceName},
199+
Cluster: aws.String(clusterName),
200+
}
201+
202+
result, err := svc.DescribeServices(context.TODO(), input)
203+
if err != nil {
204+
log.Printf("Error describing service: %v", err)
205+
return false
206+
}
207+
208+
if len(result.Services) == 0 {
209+
return false
210+
}
211+
log.Printf("service is %v", *result.Services[0].ServiceName)
212+
213+
return *result.Services[0].Status != "INACTIVE"
214+
}

pkg/core/create-task.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ func CreateTaskDefinition(UserName string, Image string, Port int32, Environment
3131
environment *[]types.KeyValuePair
3232
family string
3333
essential bool
34-
compatibility types.Compatibility
3534
cpu string
3635
memory string
3736
}

pkg/handlers/deploy-container.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,8 @@ func Deploy_container(w http.ResponseWriter, r *http.Request) {
3535
return
3636
}
3737

38-
controllers.Deploy_container(reqPayload.UserName, reqPayload.Image, reqPayload.Port, reqPayload.Environment)
38+
resp := controllers.Deploy_container(reqPayload.UserName, reqPayload.Image, reqPayload.Port, reqPayload.Environment)
3939

40-
// deploy container
41-
// ...
40+
w.Write([]byte(resp))
4241

43-
// return response to client
44-
// ...
4542
}

0 commit comments

Comments
 (0)