diff --git a/octavia/api/drivers/amphora_driver/flavor_schema.py b/octavia/api/drivers/amphora_driver/flavor_schema.py index 7231fc998a..a7196659ca 100644 --- a/octavia/api/drivers/amphora_driver/flavor_schema.py +++ b/octavia/api/drivers/amphora_driver/flavor_schema.py @@ -43,6 +43,10 @@ SUPPORTED_FLAVOR_SCHEMA = { consts.COMPUTE_FLAVOR: { "type": "string", "description": "The compute driver flavor ID." + }, + consts.AMP_IMAGE_TAG: { + "type": "string", + "description": "The amphora image tag." } } } diff --git a/octavia/api/drivers/amphora_driver/v1/driver.py b/octavia/api/drivers/amphora_driver/v1/driver.py index bff27de103..67a408c323 100644 --- a/octavia/api/drivers/amphora_driver/v1/driver.py +++ b/octavia/api/drivers/amphora_driver/v1/driver.py @@ -408,6 +408,26 @@ class AmphoraProviderDriver(driver_base.ProviderDriver): # when the octavia-lib supports it. compute_driver.validate_flavor(compute_flavor) + amp_image_tag = flavor_dict.get(consts.AMP_IMAGE_TAG, None) + if amp_image_tag: + image_driver = stevedore_driver.DriverManager( + namespace='octavia.image.drivers', + name=CONF.controller_worker.image_driver, + invoke_on_load=True + ).driver + + try: + image_driver.get_image_id_by_tag( + amp_image_tag, CONF.controller_worker.amp_image_owner_id) + except Exception as e: + raise exceptions.NotFound( + user_fault_string='Failed to find an image with tag {} ' + 'due to: {}'.format( + amp_image_tag, str(e)), + operator_fault_string='Failed to find an image with tag ' + '{} due to: {}'.format( + amp_image_tag, str(e))) + # Availability Zone def get_supported_availability_zone_metadata(self): """Returns the valid availability zone metadata keys and descriptions. diff --git a/octavia/api/drivers/amphora_driver/v2/driver.py b/octavia/api/drivers/amphora_driver/v2/driver.py index 5337d06c5a..0dcbe4481b 100644 --- a/octavia/api/drivers/amphora_driver/v2/driver.py +++ b/octavia/api/drivers/amphora_driver/v2/driver.py @@ -413,6 +413,26 @@ class AmphoraProviderDriver(driver_base.ProviderDriver): # when the octavia-lib supports it. compute_driver.validate_flavor(compute_flavor) + amp_image_tag = flavor_dict.get(consts.AMP_IMAGE_TAG, None) + if amp_image_tag: + image_driver = stevedore_driver.DriverManager( + namespace='octavia.image.drivers', + name=CONF.controller_worker.image_driver, + invoke_on_load=True + ).driver + + try: + image_driver.get_image_id_by_tag( + amp_image_tag, CONF.controller_worker.amp_image_owner_id) + except Exception as e: + raise exceptions.NotFound( + user_fault_string='Failed to find an image with tag {} ' + 'due to: {}'.format( + amp_image_tag, str(e)), + operator_fault_string='Failed to find an image with tag ' + '{} due to: {}'.format( + amp_image_tag, str(e))) + # Availability Zone def get_supported_availability_zone_metadata(self): """Returns the valid availability zone metadata keys and descriptions. diff --git a/octavia/common/constants.py b/octavia/common/constants.py index cbbf6411b9..83baf42c16 100644 --- a/octavia/common/constants.py +++ b/octavia/common/constants.py @@ -787,6 +787,7 @@ AVAILABILITY_ZONE_DATA = 'availability_zone_data' # Flavor metadata LOADBALANCER_TOPOLOGY = 'loadbalancer_topology' COMPUTE_FLAVOR = 'compute_flavor' +AMP_IMAGE_TAG = 'amp_image_tag' # TODO(johnsom) move to octavia_lib # client certification authorization option diff --git a/octavia/controller/worker/v1/tasks/compute_tasks.py b/octavia/controller/worker/v1/tasks/compute_tasks.py index f237e9b4f1..168590167c 100644 --- a/octavia/controller/worker/v1/tasks/compute_tasks.py +++ b/octavia/controller/worker/v1/tasks/compute_tasks.py @@ -73,9 +73,12 @@ class ComputeCreate(BaseComputeTask): CONF.controller_worker.loadbalancer_topology) amp_compute_flavor = flavor.get( constants.COMPUTE_FLAVOR, CONF.controller_worker.amp_flavor_id) + amp_image_tag = flavor.get( + constants.AMP_IMAGE_TAG, CONF.controller_worker.amp_image_tag) else: topology = CONF.controller_worker.loadbalancer_topology amp_compute_flavor = CONF.controller_worker.amp_flavor_id + amp_image_tag = CONF.controller_worker.amp_image_tag if availability_zone: amp_availability_zone = availability_zone.get( @@ -108,7 +111,7 @@ class ComputeCreate(BaseComputeTask): compute_id = self.compute.build( name="amphora-" + amphora_id, amphora_flavor=amp_compute_flavor, - image_tag=CONF.controller_worker.amp_image_tag, + image_tag=amp_image_tag, image_owner=CONF.controller_worker.amp_image_owner_id, key_name=key_name, sec_groups=CONF.controller_worker.amp_secgroup_list, diff --git a/octavia/controller/worker/v2/tasks/compute_tasks.py b/octavia/controller/worker/v2/tasks/compute_tasks.py index faac953b74..fda27e4a58 100644 --- a/octavia/controller/worker/v2/tasks/compute_tasks.py +++ b/octavia/controller/worker/v2/tasks/compute_tasks.py @@ -78,9 +78,12 @@ class ComputeCreate(BaseComputeTask): CONF.controller_worker.loadbalancer_topology) amp_compute_flavor = flavor.get( constants.COMPUTE_FLAVOR, CONF.controller_worker.amp_flavor_id) + amp_image_tag = flavor.get( + constants.AMP_IMAGE_TAG, CONF.controller_worker.amp_image_tag) else: topology = CONF.controller_worker.loadbalancer_topology amp_compute_flavor = CONF.controller_worker.amp_flavor_id + amp_image_tag = CONF.controller_worker.amp_image_tag if availability_zone: amp_availability_zone = availability_zone.get( @@ -113,7 +116,7 @@ class ComputeCreate(BaseComputeTask): compute_id = self.compute.build( name="amphora-" + amphora_id, amphora_flavor=amp_compute_flavor, - image_tag=CONF.controller_worker.amp_image_tag, + image_tag=amp_image_tag, image_owner=CONF.controller_worker.amp_image_owner_id, key_name=key_name, sec_groups=CONF.controller_worker.amp_secgroup_list, diff --git a/releasenotes/notes/add-amphora-image-tag-capability-ba2ea034bc01ab48.yaml b/releasenotes/notes/add-amphora-image-tag-capability-ba2ea034bc01ab48.yaml new file mode 100644 index 0000000000..acb210c7e9 --- /dev/null +++ b/releasenotes/notes/add-amphora-image-tag-capability-ba2ea034bc01ab48.yaml @@ -0,0 +1,7 @@ +--- +features: + - | + Operators can now use the 'amp_image_tag' Octavia flavor capability when + using the amphora provider driver. This allows custom amphora images to be + used per-load balancer. If this is not defined in an Octavia flavor, the + amp_image_tag Octavia configuration file setting will continue to be used.