// ensureGroup returns the security group with name and perms. // If a group with name does not exist, one will be created. // If it exists, its permissions are set to perms. func (e *environ) ensureGroup(name string, rules []nova.RuleInfo) (nova.SecurityGroup, error) { novaClient := e.nova() // First attempt to look up an existing group by name. group, err := novaClient.SecurityGroupByName(name) if err == nil { // Group exists, so assume it is correctly set up and return it. return *group, nil } // Doesn't exist, so try and create it. group, err = novaClient.CreateSecurityGroup(name, "juju group") if err != nil { if !gooseerrors.IsDuplicateValue(err) { return zeroGroup, err } else { // We just tried to create a duplicate group, so load the existing group. group, err = novaClient.SecurityGroupByName(name) if err != nil { return zeroGroup, err } return *group, nil } } // The new group is created so now add the rules. group.Rules = make([]nova.SecurityGroupRule, len(rules)) for i, rule := range rules { rule.ParentGroupId = group.Id groupRule, err := novaClient.CreateSecurityGroupRule(rule) if err != nil && !gooseerrors.IsDuplicateValue(err) { return zeroGroup, err } group.Rules[i] = *groupRule } return *group, nil }
// ensureGroup returns the security group with name and perms. // If a group with name does not exist, one will be created. // If it exists, its permissions are set to perms. func (e *environ) ensureGroup(name string, rules []nova.RuleInfo) (nova.SecurityGroup, error) { nova := e.nova() group, err := nova.CreateSecurityGroup(name, "juju group") if err != nil { if !gooseerrors.IsDuplicateValue(err) { return zeroGroup, err } else { // We just tried to create a duplicate group, so load the existing group. group, err = nova.SecurityGroupByName(name) if err != nil { return zeroGroup, err } } } // The group is created so now add the rules. for _, rule := range rules { rule.ParentGroupId = group.Id _, err := nova.CreateSecurityGroupRule(rule) if err != nil && !gooseerrors.IsDuplicateValue(err) { return zeroGroup, err } } return *group, nil }