Skip to content

Commit

Permalink
NET-9178-Consul-api-gateway-not-starting-after-restart (#3978)
Browse files Browse the repository at this point in the history
* don't error if role already exists on restart

* changelog

* lint
  • Loading branch information
sarahalsmiller authored May 9, 2024
1 parent a82ef18 commit 69ba66c
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
3 changes: 3 additions & 0 deletions .changelog/3978.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
connect-inject: Fixed issue where on restart, if a managed-gateway-acl-role already existed the container would error
```
25 changes: 21 additions & 4 deletions control-plane/api-gateway/cache/consul.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,10 @@ func (c *Cache) ensurePolicy(client *api.Client, gatewayName string) (string, er
return existing.ID, nil
}

func getACLRoleName(gatewayName string) string {
return fmt.Sprint("managed-gateway-acl-role-", gatewayName)
}

func (c *Cache) ensureRole(client *api.Client, gatewayName string) (string, error) {
policyID, err := c.ensurePolicy(client, gatewayName)
if err != nil {
Expand All @@ -407,19 +411,21 @@ func (c *Cache) ensureRole(client *api.Client, gatewayName string) (string, erro
defer c.aclRoleMutex.Unlock()

createRole := func() (string, error) {
aclRoleName := fmt.Sprint("managed-gateway-acl-role-", gatewayName)
aclRoleName := getACLRoleName(gatewayName)
role := &api.ACLRole{
Name: aclRoleName,
Description: "ACL Role for Managed API Gateways",
Policies: []*api.ACLLink{{ID: policyID}},
}

_, _, err = client.ACL().RoleCreate(role, &api.WriteOptions{})
if err != nil {
if err != nil && !isRoleExistsErr(err, aclRoleName) {
//don't error out in the case that the role already exists.
return "", err
}

c.gatewayNameToRole[gatewayName] = role
return aclRoleName, err
return aclRoleName, nil
}

cachedRole, found := c.gatewayNameToRole[gatewayName]
Expand Down Expand Up @@ -592,7 +598,18 @@ func ignoreACLsDisabled(err error) error {
// isPolicyExistsErr returns true if err is due to trying to call the
// policy create API when the policy already exists.
func isPolicyExistsErr(err error, policyName string) bool {
return isExistsErr(err, "Policy", policyName)
}

// isExistsErr returns true if err is due to trying to call an API for a given type and it already exists.
func isExistsErr(err error, typeName, name string) bool {
return err != nil &&
strings.Contains(err.Error(), "Unexpected response code: 500") &&
strings.Contains(err.Error(), fmt.Sprintf("Invalid Policy: A Policy with Name %q already exists", policyName))
strings.Contains(err.Error(), fmt.Sprintf("Invalid %s: A %s with Name %q already exists", typeName, typeName, name))
}

// isRoleExistsErr returns true if err is due to trying to call the
// role create API when the role already exists.
func isRoleExistsErr(err error, roleName string) bool {
return isExistsErr(err, "Role", roleName)
}

0 comments on commit 69ba66c

Please sign in to comment.