Skip to content

Commit 390d3e6

Browse files
Create namespace when it does not exist (#25)
Create http namespace in Cloud Map if necessary when creating a service. Co-authored-by: thalles <[email protected]>
1 parent 98f9071 commit 390d3e6

File tree

1 file changed

+50
-5
lines changed

1 file changed

+50
-5
lines changed

pkg/cloudmap/client.go

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ package cloudmap
22

33
import (
44
"context"
5-
"errors"
65
"fmt"
76
"github.com/aws/aws-cloud-map-mcs-controller-for-k8s/pkg/model"
87
"github.com/aws/aws-sdk-go-v2/aws"
98
sd "github.com/aws/aws-sdk-go-v2/service/servicediscovery"
109
"github.com/aws/aws-sdk-go-v2/service/servicediscovery/types"
1110
"github.com/go-logr/logr"
1211
"k8s.io/apimachinery/pkg/util/cache"
12+
"k8s.io/apimachinery/pkg/util/wait"
1313
ctrl "sigs.k8s.io/controller-runtime"
1414
"time"
1515
)
@@ -86,11 +86,28 @@ func (sdc *serviceDiscoveryClient) CreateService(ctx context.Context, service *m
8686
sdc.log.Info("creating a new service", "namespace", service.Namespace, "name", service.Name)
8787

8888
nsId, nsErr := sdc.getNamespaceId(ctx, service.Namespace)
89-
9089
if nsErr != nil {
9190
return nsErr
9291
}
9392

93+
if nsId == "" {
94+
nsOutput, nsErr := sdc.sdApi.CreateHttpNamespace(ctx, &sd.CreateHttpNamespaceInput{
95+
Name: &service.Namespace,
96+
})
97+
98+
if nsErr != nil {
99+
return nsErr
100+
}
101+
opResult, opErr := sdc.WaitUntilSuccessOperation(ctx, nsOutput.OperationId)
102+
if opErr != nil {
103+
return opErr
104+
}
105+
nsId = opResult.Operation.Targets["NAMESPACE"]
106+
sdc.namespaceIdCache.Add(
107+
service.Namespace,
108+
nsId, defaultNamespaceIdCacheTTL)
109+
}
110+
94111
//TODO: Handle non-http namespaces
95112
sdSrv, srvErr := sdc.sdApi.CreateService(ctx, &sd.CreateServiceInput{
96113
Name: &service.Name,
@@ -106,6 +123,32 @@ func (sdc *serviceDiscoveryClient) CreateService(ctx context.Context, service *m
106123

107124
return sdc.RegisterEndpoints(ctx, service)
108125
}
126+
func (sdc *serviceDiscoveryClient) WaitUntilSuccessOperation(ctx context.Context, operationId *string) (*sd.GetOperationOutput, error) {
127+
opResult := &sd.GetOperationOutput{}
128+
var opErr error
129+
err := wait.PollUntil(defaultOperationPollInterval, func() (bool, error) {
130+
opResult, opErr = sdc.sdApi.GetOperation(ctx, &sd.GetOperationInput{
131+
OperationId: operationId,
132+
})
133+
if opErr != nil {
134+
return true, opErr
135+
}
136+
137+
if opResult.Operation.Status == types.OperationStatusFail {
138+
return true, fmt.Errorf("failed to create namespace.Reason: %s", *opResult.Operation.ErrorMessage)
139+
}
140+
141+
if opResult.Operation.Status == types.OperationStatusSuccess {
142+
return true, nil
143+
}
144+
145+
return false, nil
146+
}, ctx.Done())
147+
if err != nil {
148+
return nil, err
149+
}
150+
return opResult, nil
151+
}
109152

110153
func (sdc *serviceDiscoveryClient) GetService(ctx context.Context, namespaceName string, serviceName string) (*model.Service, error) {
111154
sdc.log.Info("fetching a service", "namespaceName", namespaceName, "serviceName", serviceName)
@@ -179,7 +222,9 @@ func (sdc *serviceDiscoveryClient) getNamespaceId(ctx context.Context, nsName st
179222
return "", err
180223
}
181224

182-
sdc.namespaceIdCache.Add(nsName, nsId, defaultNamespaceIdCacheTTL)
225+
if nsId != "" {
226+
sdc.namespaceIdCache.Add(nsName, nsId, defaultNamespaceIdCacheTTL)
227+
}
183228

184229
return nsId, err
185230
}
@@ -201,7 +246,7 @@ func (sdc *serviceDiscoveryClient) getNamespaceIdFromCloudMap(ctx context.Contex
201246
}
202247
}
203248

204-
return "", errors.New(fmt.Sprintf("namespace %s not found", nsName))
249+
return "", nil
205250
}
206251

207252
func (sdc *serviceDiscoveryClient) getServiceId(ctx context.Context, nsName string, svcName string) (string, error) {
@@ -244,7 +289,7 @@ func (sdc *serviceDiscoveryClient) listServicesFromCloudMap(ctx context.Context,
244289
svcs := make([]*types.ServiceSummary, 0)
245290

246291
nsId, nsErr := sdc.getNamespaceId(ctx, nsName)
247-
if nsErr != nil {
292+
if nsErr != nil || nsId == "" {
248293
return svcs, nil
249294
}
250295

0 commit comments

Comments
 (0)