Merge "Fix GroupSet assignment to use resource id instead of name"
This commit is contained in:
commit
61090f485e
@ -16,6 +16,7 @@
|
|||||||
from heat.engine import clients
|
from heat.engine import clients
|
||||||
from heat.openstack.common import log as logging
|
from heat.openstack.common import log as logging
|
||||||
from heat.engine import resource
|
from heat.engine import resource
|
||||||
|
from heat.common import exception
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -62,7 +63,16 @@ class NetworkInterface(resource.Resource):
|
|||||||
}
|
}
|
||||||
|
|
||||||
if self.properties['GroupSet']:
|
if self.properties['GroupSet']:
|
||||||
props['security_groups'] = self.properties['GroupSet']
|
props['security_groups'] = []
|
||||||
|
|
||||||
|
for sg in self.properties.get('GroupSet'):
|
||||||
|
resource = self.stack.resource_by_refid(sg)
|
||||||
|
if resource:
|
||||||
|
props['security_groups'].append(resource.resource_id)
|
||||||
|
else:
|
||||||
|
raise exception.InvalidTemplateAttribute(
|
||||||
|
resource=self.name,
|
||||||
|
key='GroupSet')
|
||||||
port = client.create_port({'port': props})['port']
|
port = client.create_port({'port': props})['port']
|
||||||
self.resource_id_set(port['id'])
|
self.resource_id_set(port['id'])
|
||||||
|
|
||||||
|
@ -49,6 +49,13 @@ class VPCTestBase(HeatTestCase):
|
|||||||
self.m.StubOutWithMock(quantumclient.Client, 'remove_interface_router')
|
self.m.StubOutWithMock(quantumclient.Client, 'remove_interface_router')
|
||||||
self.m.StubOutWithMock(quantumclient.Client, 'show_subnet')
|
self.m.StubOutWithMock(quantumclient.Client, 'show_subnet')
|
||||||
self.m.StubOutWithMock(quantumclient.Client, 'show_network')
|
self.m.StubOutWithMock(quantumclient.Client, 'show_network')
|
||||||
|
self.m.StubOutWithMock(quantumclient.Client, 'create_security_group')
|
||||||
|
self.m.StubOutWithMock(quantumclient.Client, 'show_security_group')
|
||||||
|
self.m.StubOutWithMock(quantumclient.Client, 'delete_security_group')
|
||||||
|
self.m.StubOutWithMock(
|
||||||
|
quantumclient.Client, 'create_security_group_rule')
|
||||||
|
self.m.StubOutWithMock(
|
||||||
|
quantumclient.Client, 'delete_security_group_rule')
|
||||||
|
|
||||||
def create_stack(self, template):
|
def create_stack(self, template):
|
||||||
t = template_format.parse(template)
|
t = template_format.parse(template)
|
||||||
@ -108,6 +115,66 @@ class VPCTestBase(HeatTestCase):
|
|||||||
u'bbbb',
|
u'bbbb',
|
||||||
{'subnet_id': 'cccc'}).AndReturn(None)
|
{'subnet_id': 'cccc'}).AndReturn(None)
|
||||||
|
|
||||||
|
def mock_create_security_group(self):
|
||||||
|
quantumclient.Client.create_security_group({
|
||||||
|
'security_group': {
|
||||||
|
'name': 'test_stack.the_sg',
|
||||||
|
'description': 'SSH access'
|
||||||
|
}
|
||||||
|
}).AndReturn({
|
||||||
|
'security_group': {
|
||||||
|
'tenant_id': 'c1210485b2424d48804aad5d39c61b8f',
|
||||||
|
'name': 'test_stack.the_sg',
|
||||||
|
'description': 'SSH access',
|
||||||
|
'security_group_rules': [],
|
||||||
|
'id': 'aaaa'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
quantumclient.Client.create_security_group_rule({
|
||||||
|
'security_group_rule': {
|
||||||
|
'direction': 'ingress',
|
||||||
|
'remote_ip_prefix': '0.0.0.0/0',
|
||||||
|
'port_range_min': 22,
|
||||||
|
'ethertype': 'IPv4',
|
||||||
|
'port_range_max': 22,
|
||||||
|
'protocol': 'tcp',
|
||||||
|
'security_group_id': 'aaaa'
|
||||||
|
}
|
||||||
|
}).AndReturn({
|
||||||
|
'security_group_rule': {
|
||||||
|
'direction': 'ingress',
|
||||||
|
'remote_ip_prefix': '0.0.0.0/0',
|
||||||
|
'port_range_min': 22,
|
||||||
|
'ethertype': 'IPv4',
|
||||||
|
'port_range_max': 22,
|
||||||
|
'protocol': 'tcp',
|
||||||
|
'security_group_id': 'aaaa',
|
||||||
|
'id': 'bbbb'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
def mock_delete_security_group(self):
|
||||||
|
quantumclient.Client.show_security_group('aaaa').AndReturn({
|
||||||
|
'security_group': {
|
||||||
|
'tenant_id': 'c1210485b2424d48804aad5d39c61b8f',
|
||||||
|
'name': 'sc1',
|
||||||
|
'description': '',
|
||||||
|
'security_group_rules': [{
|
||||||
|
'direction': 'ingress',
|
||||||
|
'protocol': 'tcp',
|
||||||
|
'port_range_max': 22,
|
||||||
|
'id': 'bbbb',
|
||||||
|
'ethertype': 'IPv4',
|
||||||
|
'security_group_id': 'aaaa',
|
||||||
|
'remote_ip_prefix': '0.0.0.0/0',
|
||||||
|
'tenant_id': 'c1210485b2424d48804aad5d39c61b8f',
|
||||||
|
'port_range_min': 22
|
||||||
|
}],
|
||||||
|
'id': 'aaaa'}})
|
||||||
|
quantumclient.Client.delete_security_group_rule('bbbb').AndReturn(None)
|
||||||
|
quantumclient.Client.delete_security_group('aaaa').AndReturn(None)
|
||||||
|
|
||||||
def mock_delete_network(self):
|
def mock_delete_network(self):
|
||||||
quantumclient.Client.delete_router('bbbb').AndReturn(None)
|
quantumclient.Client.delete_router('bbbb').AndReturn(None)
|
||||||
quantumclient.Client.delete_network('aaaa').AndReturn(None)
|
quantumclient.Client.delete_network('aaaa').AndReturn(None)
|
||||||
@ -209,6 +276,16 @@ class NetworkInterfaceTest(VPCTestBase):
|
|||||||
test_template = '''
|
test_template = '''
|
||||||
HeatTemplateFormatVersion: '2012-12-12'
|
HeatTemplateFormatVersion: '2012-12-12'
|
||||||
Resources:
|
Resources:
|
||||||
|
the_sg:
|
||||||
|
Type: AWS::EC2::SecurityGroup
|
||||||
|
Properties:
|
||||||
|
VpcId: {Ref: the_vpc}
|
||||||
|
GroupDescription: SSH access
|
||||||
|
SecurityGroupIngress:
|
||||||
|
- IpProtocol: tcp
|
||||||
|
FromPort: 22
|
||||||
|
ToPort: 22
|
||||||
|
CidrIp: 0.0.0.0/0
|
||||||
the_vpc:
|
the_vpc:
|
||||||
Type: AWS::EC2::VPC
|
Type: AWS::EC2::VPC
|
||||||
Properties: {CidrBlock: '10.0.0.0/16'}
|
Properties: {CidrBlock: '10.0.0.0/16'}
|
||||||
@ -223,6 +300,39 @@ Resources:
|
|||||||
Properties:
|
Properties:
|
||||||
PrivateIpAddress: 10.0.0.100
|
PrivateIpAddress: 10.0.0.100
|
||||||
SubnetId: {Ref: the_subnet}
|
SubnetId: {Ref: the_subnet}
|
||||||
|
GroupSet:
|
||||||
|
- Ref: the_sg
|
||||||
|
'''
|
||||||
|
|
||||||
|
test_template_error = '''
|
||||||
|
HeatTemplateFormatVersion: '2012-12-12'
|
||||||
|
Resources:
|
||||||
|
the_sg:
|
||||||
|
Type: AWS::EC2::SecurityGroup
|
||||||
|
Properties:
|
||||||
|
VpcId: {Ref: the_vpc}
|
||||||
|
GroupDescription: SSH access
|
||||||
|
SecurityGroupIngress:
|
||||||
|
- IpProtocol: tcp
|
||||||
|
FromPort: 22
|
||||||
|
ToPort: 22
|
||||||
|
CidrIp: 0.0.0.0/0
|
||||||
|
the_vpc:
|
||||||
|
Type: AWS::EC2::VPC
|
||||||
|
Properties: {CidrBlock: '10.0.0.0/16'}
|
||||||
|
the_subnet:
|
||||||
|
Type: AWS::EC2::Subnet
|
||||||
|
Properties:
|
||||||
|
CidrBlock: 10.0.0.0/24
|
||||||
|
VpcId: {Ref: the_vpc}
|
||||||
|
AvailabilityZone: moon
|
||||||
|
the_nic:
|
||||||
|
Type: AWS::EC2::NetworkInterface
|
||||||
|
Properties:
|
||||||
|
PrivateIpAddress: 10.0.0.100
|
||||||
|
SubnetId: {Ref: the_subnet}
|
||||||
|
GroupSet:
|
||||||
|
- Ref: INVALID-REF-IN-TEMPLATE
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def mock_create_network_interface(self):
|
def mock_create_network_interface(self):
|
||||||
@ -233,7 +343,8 @@ Resources:
|
|||||||
'ip_address': u'10.0.0.100'
|
'ip_address': u'10.0.0.100'
|
||||||
}],
|
}],
|
||||||
'name': u'test_stack.the_nic',
|
'name': u'test_stack.the_nic',
|
||||||
'admin_state_up': True
|
'admin_state_up': True,
|
||||||
|
'security_groups': ['aaaa']
|
||||||
}}).AndReturn({
|
}}).AndReturn({
|
||||||
'port': {
|
'port': {
|
||||||
'admin_state_up': True,
|
'admin_state_up': True,
|
||||||
@ -258,12 +369,14 @@ Resources:
|
|||||||
quantumclient.Client.delete_port('dddd').AndReturn(None)
|
quantumclient.Client.delete_port('dddd').AndReturn(None)
|
||||||
|
|
||||||
def test_network_interface(self):
|
def test_network_interface(self):
|
||||||
|
self.mock_create_security_group()
|
||||||
self.mock_create_network()
|
self.mock_create_network()
|
||||||
self.mock_create_subnet()
|
self.mock_create_subnet()
|
||||||
self.mock_create_network_interface()
|
self.mock_create_network_interface()
|
||||||
self.mock_delete_network_interface()
|
self.mock_delete_network_interface()
|
||||||
self.mock_delete_subnet()
|
self.mock_delete_subnet()
|
||||||
self.mock_delete_network()
|
self.mock_delete_network()
|
||||||
|
self.mock_delete_security_group()
|
||||||
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
@ -276,6 +389,12 @@ Resources:
|
|||||||
stack.delete()
|
stack.delete()
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_network_interface_error(self):
|
||||||
|
self.assertRaises(
|
||||||
|
KeyError,
|
||||||
|
self.create_stack,
|
||||||
|
self.test_template_error)
|
||||||
|
|
||||||
|
|
||||||
class InternetGatewayTest(VPCTestBase):
|
class InternetGatewayTest(VPCTestBase):
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user