diff --git a/tobiko/openstack/heat/_stack.py b/tobiko/openstack/heat/_stack.py index f94f49d73..701e2a50a 100644 --- a/tobiko/openstack/heat/_stack.py +++ b/tobiko/openstack/heat/_stack.py @@ -93,6 +93,9 @@ class HeatStackFixture(tobiko.SharedFixture): def setup_stack(self): self.create_stack() + def get_stack_parameters(self): + return tobiko.reset_fixture(self.parameters).values + def create_stack(self, retry=None): """Creates stack based on passed parameters.""" created_stack_ids = set() @@ -133,7 +136,7 @@ class HeatStackFixture(tobiko.SharedFixture): self.stack = self._outputs = None # Compile template parameters - parameters = tobiko.reset_fixture(self.parameters).values + parameters = self.get_stack_parameters() try: LOG.debug('Creating stack %r (re-tries left %d)...', self.stack_name, retry) diff --git a/tobiko/openstack/stacks/__init__.py b/tobiko/openstack/stacks/__init__.py index 6344fdecc..785eaf717 100644 --- a/tobiko/openstack/stacks/__init__.py +++ b/tobiko/openstack/stacks/__init__.py @@ -19,6 +19,8 @@ from tobiko.openstack.stacks import _neutron from tobiko.openstack.stacks import _nova KeyPairStackFixture = _nova.KeyPairStackFixture +FlavorStackFixture = _nova.FlavorStackFixture +CirrosFlavorStackFixture = _nova.CirrosFlavorStackFixture NetworkStackFixture = _neutron.NetworkStackFixture NetworkWithNetMtuWriteStackFixture = ( diff --git a/tobiko/openstack/stacks/_neutron.py b/tobiko/openstack/stacks/_neutron.py index 60ca6cc6d..90f451569 100644 --- a/tobiko/openstack/stacks/_neutron.py +++ b/tobiko/openstack/stacks/_neutron.py @@ -186,8 +186,14 @@ class FloatingIpServerStackFixture(heat.HeatStackFixture): """password used to login to a Nova server instance""" return self.image_fixture.password - #: Nova flavor used to create a Nova server instance - flavor = CONF.tobiko.nova.flavor + # Stack used to create flavor for Nova server instance + flavor_stack = tobiko.required_setup_fixture( + _nova.CirrosFlavorStackFixture) + + @property + def flavor(self): + """Flavor for Nova server instance""" + return self.flavor_stack.flavor_id #: Whenever port security on internal network is enable port_security_enabled = False diff --git a/tobiko/openstack/stacks/_nova.py b/tobiko/openstack/stacks/_nova.py index 682954ced..e72b72685 100644 --- a/tobiko/openstack/stacks/_nova.py +++ b/tobiko/openstack/stacks/_nova.py @@ -44,6 +44,28 @@ class KeyPairStackFixture(heat.HeatStackFixture): self.public_key = as_str(fd.read()) +class FlavorStackFixture(heat.HeatStackFixture): + template = _hot.heat_template_file('nova/flavor.yaml') + + disk = None + ephemeral = None + extra_specs = None + is_public = None + name = None + rxtx_factor = None + swap = None + vcpus = None + + def get_stack_parameters(self): + parameters = super(FlavorStackFixture, self).get_stack_parameters() + parameters.setdefault('name', self.stack_name) + return parameters + + +class CirrosFlavorStackFixture(FlavorStackFixture): + ram = 64 + + def as_str(text): if isinstance(text, six.string_types): return text diff --git a/tobiko/openstack/stacks/nova/flavor.yaml b/tobiko/openstack/stacks/nova/flavor.yaml new file mode 100644 index 000000000..531ff4e58 --- /dev/null +++ b/tobiko/openstack/stacks/nova/flavor.yaml @@ -0,0 +1,81 @@ +heat_template_version: newton + +description: | + Creates a nova SSH keypair to be used for creating Nova servers + + +parameters: + + disk: + type: number + description: | + Size of local disk in GB. The “0” size is a special case that uses the + native base image size as the size of the ephemeral root volume. + default: 0 + + ephemeral: + type: number + description: Size of a secondary ephemeral data disk in GB. + default: 0 + + extra_specs: + type: json + description: Key/Value pairs to extend the capabilities of the flavor. + default: {} + + is_public: + type: boolean + description: | + Scope of flavor accessibility. Public or private. Default value is True, + means public, shared across all projects. + default: true + + name: + type: string + description: Name of the flavor. + + ram: + type: number + description: Memory in MB for the flavor + + rxtx_factor: + type: number + description: RX/TX factor. + default: 1.0 + + swap: + type: number + description: Swap space in MB. + default: 0 + + vcpus: + type: number + description: Number of VCPUs for the flavor + default: 1 + + +resources: + + flavor: + type: OS::Nova::Flavor + properties: + disk: {get_param: disk} + ephemeral: {get_param: ephemeral} + extra_specs: {get_param: extra_specs} + is_public: {get_param: is_public} + name: {get_param: name} + ram: {get_param: ram} + rxtx_factor: {get_param: rxtx_factor} + swap: {get_param: swap} + vcpus: {get_param: vcpus} + + +outputs: + + flavor_id: + description: unique Nova flavor ID + value: {get_resource: flavor} + + falvor_name: + description: Nova flavor name + value: {get_attr: [flavor, show, name]}