When CMS API call is made for either create and update customer, a A new optional customer domain field is introduced for CMS API call to create or update customer. The customer domain value will be used by Rds to set the customer and users domain value when generating the heat template. In the event customer domain is not provided by the CMS API call, a default value will be retrieved from the config file. Change-Id: I58dbae760d56b756b72c5d9eaf7c0b61cf193847
		
			
				
	
	
		
			584 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			584 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
"""create resource unittest module."""
 | 
						|
import unittest
 | 
						|
from unittest.mock import patch
 | 
						|
 | 
						|
from orm.common.orm_common.model.models import (ResourceStatusModel,
 | 
						|
                                                ResourceMetaData,
 | 
						|
                                                StatusModel)
 | 
						|
from orm.services.resource_distributor.rds.services import resource as ResourceService
 | 
						|
 | 
						|
result = ResourceStatusModel(
 | 
						|
    status="success", timestamp="123456789", region="name",
 | 
						|
    transaction_id=5, resource_id="1",
 | 
						|
    ord_notifier="", err_msg="123", err_code="12", operation="create",
 | 
						|
    resource_extra_metadata=[ResourceMetaData(checksum=1, virtual_size=2, size=3)]
 | 
						|
)
 | 
						|
 | 
						|
uuid = "uuid-12345"
 | 
						|
 | 
						|
 | 
						|
class InputData(object):
 | 
						|
    """mock class."""
 | 
						|
 | 
						|
    def __init__(self, resource_id, resource_type,
 | 
						|
                 targets, operation="create",
 | 
						|
                 transaction_id="", model="",
 | 
						|
                 external_transaction_id=""):
 | 
						|
        """init function.
 | 
						|
 | 
						|
        : param resource_id:
 | 
						|
        : param resource_type:
 | 
						|
        : param targets:
 | 
						|
        : param operation:
 | 
						|
        : param transaction_id:
 | 
						|
        : param model:
 | 
						|
        : param external_transaction_id:
 | 
						|
        """
 | 
						|
        self.resource_id = resource_id
 | 
						|
        self.targets = targets
 | 
						|
        self.resource_type = resource_type
 | 
						|
        self.operation = operation
 | 
						|
        self.transaction_id = transaction_id
 | 
						|
        self.model = model
 | 
						|
        self.external_transaction_id = external_transaction_id
 | 
						|
 | 
						|
 | 
						|
class CreateResource(unittest.TestCase):
 | 
						|
    """create resource test."""
 | 
						|
 | 
						|
    @patch.object(ResourceService.regionResourceIdStatus, 'add_status',
 | 
						|
                  return_value=None)
 | 
						|
    @patch.object(ResourceService, '_submit_template_data', return_value=[1, 2])
 | 
						|
    @patch.object(ResourceService, '_create_template_data', return_value=[1, 2])
 | 
						|
    @patch.object(ResourceService.regionResourceIdStatus,
 | 
						|
                  'get_regions_by_status_resource_id', return_value=None)
 | 
						|
    @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
 | 
						|
                  side_effect=Exception("uuid general exception"))
 | 
						|
    def test_create_customer_not_valid_uuid_gen(self, tranid, result, sotdata,
 | 
						|
                                                sotupload, database):
 | 
						|
        """uuid gen raise an error."""
 | 
						|
        status_model = StatusModel(status=[result])
 | 
						|
        status_model.regions = None
 | 
						|
        result.return_value = status_model
 | 
						|
        with self.assertRaises(ResourceService.ErrorMessage):
 | 
						|
            resource_id = ResourceService.main(jsondata, uuid,
 | 
						|
                                               'customer', 'create')
 | 
						|
 | 
						|
    @patch.object(ResourceService.regionResourceIdStatus,
 | 
						|
                  'add_status', return_value=None)
 | 
						|
    @patch.object(ResourceService.yaml_customer_builder,
 | 
						|
                  'yamlbuilder', return_value=["anystring"])
 | 
						|
    @patch.object(ResourceService.regionResourceIdStatus,
 | 
						|
                  'get_regions_by_status_resource_id', return_value=None)
 | 
						|
    @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
 | 
						|
                  return_value='uuid-gen-123456')
 | 
						|
    def test_create_flavor_data_check(self,
 | 
						|
                                      tranid, result,
 | 
						|
                                      yamlbuilder, database):
 | 
						|
        """check list creating."""
 | 
						|
        input_data = InputData(
 | 
						|
            transaction_id='497ab942-1ac0-11e6-82f3-005056a5129b',
 | 
						|
            resource_type='customer',
 | 
						|
            resource_id='1e24981a-fa51-11e5-86aa-5e5517507c66',
 | 
						|
            operation='create',
 | 
						|
            targets=targets
 | 
						|
        )
 | 
						|
        input_data.user_data = {'user_domain': 'default', 'user_id': 'user1'}
 | 
						|
        status_model = StatusModel(status=[result])
 | 
						|
        status_model.regions = None
 | 
						|
        result.return_value = status_model
 | 
						|
        result = ResourceService._create_template_data(input_data)
 | 
						|
        self.assertEqual(result, target_list)
 | 
						|
 | 
						|
    # @patch.object(ResourceService.regionResourceIdStatus,
 | 
						|
    #               'get_regions_by_status_resource_id',
 | 
						|
    #               return_value=StatusModel(status=[result]))
 | 
						|
    # def test_delete_flavor_conflict(self, databasemock):
 | 
						|
    #     """check delete flavor with conflict."""
 | 
						|
    #     with self.assertRaises(ResourceService.ConflictValue):
 | 
						|
    #         ResourceService.main(flavorjsondata, uuid, 'flavor', 'delete')
 | 
						|
 | 
						|
    @patch.object(ResourceService.regionResourceIdStatus,
 | 
						|
                  'add_status', return_value=None)
 | 
						|
    @patch.object(ResourceService, '_submit_template_data', return_value=[1, 2])
 | 
						|
    @patch.object(ResourceService, '_create_template_data', return_value=[1, 2])
 | 
						|
    @patch.object(ResourceService.regionResourceIdStatus,
 | 
						|
                  'get_regions_by_status_resource_id', return_value=None)
 | 
						|
    @patch.object(ResourceService.uuid_utils, 'get_random_uuid',
 | 
						|
                  side_effect=Exception("uuid general exception"))
 | 
						|
    def test_delete_flavor_not_valid_uuid_gen(self, tranid, result, sotdata,
 | 
						|
                                              sotupload, database):
 | 
						|
        """delete flavor uuid gen raise an error."""
 | 
						|
        status_model = StatusModel(status=[result])
 | 
						|
        status_model.regions = None
 | 
						|
        result.return_value = status_model
 | 
						|
        with self.assertRaises(ResourceService.ErrorMessage):
 | 
						|
            resource_id = ResourceService.main(flavorjsondata, uuid,
 | 
						|
                                               'flavor', 'delete')
 | 
						|
 | 
						|
    def test_get_inputs_from_resource_type(self):
 | 
						|
        input_data = ResourceService._get_inputs_from_resource_type(jsondata,
 | 
						|
                                                                    'customer',
 | 
						|
                                                                    'uuid-12345')
 | 
						|
        assert (input_data.__dict__ == input_data_resource)
 | 
						|
 | 
						|
    def test_get_inputs_from_resource_type_image(self):
 | 
						|
        input_data = ResourceService._get_inputs_from_resource_type(json_data_image,
 | 
						|
                                                                    'image',
 | 
						|
                                                                    'uuid-12345')
 | 
						|
        assert (input_data.__dict__ == expected_image_input_data)
 | 
						|
 | 
						|
    def test_unknown_resource_type(self):
 | 
						|
        with self.assertRaises(ResourceService.ErrorMessage):
 | 
						|
            input_data = ResourceService._get_inputs_from_resource_type(jsondata,
 | 
						|
                                                                        'unknown',
 | 
						|
                                                                        'uuid-12345')
 | 
						|
 | 
						|
 | 
						|
jsondata = {
 | 
						|
    "uuid": "1e24981a-fa51-11e5-86aa-5e5517507c66", "default_region":
 | 
						|
        {
 | 
						|
            "quotas":
 | 
						|
                [
 | 
						|
                    {
 | 
						|
                        "compute": {
 | 
						|
                            "instances": "10",
 | 
						|
                            "ram": "10",
 | 
						|
                            "keypairs": "10"
 | 
						|
                        },
 | 
						|
                        "storage": {"gigabytes": "10",
 | 
						|
                                    "snapshots": "10",
 | 
						|
                                    "volumes": "10"
 | 
						|
                                    },
 | 
						|
                        "network": {
 | 
						|
                            "router": "10",
 | 
						|
                            "floatingip": "10",
 | 
						|
                            "port": "10",
 | 
						|
                            "network": "10",
 | 
						|
                            "subnet": "10"
 | 
						|
                        }}],
 | 
						|
            "users":
 | 
						|
                [
 | 
						|
                    {
 | 
						|
                        "id": "userId1zzzz",
 | 
						|
                        "roles":
 | 
						|
                            [
 | 
						|
                                "adminzzzz",
 | 
						|
                                "otherzzzzz"
 | 
						|
                            ]
 | 
						|
                    },
 | 
						|
                    {"id": "userId2zzz",
 | 
						|
                     "roles":
 | 
						|
                         [
 | 
						|
                             "storagezzzzz"
 | 
						|
                         ]
 | 
						|
                     }
 | 
						|
                ],
 | 
						|
            "name": "regionnamezzzz",
 | 
						|
            "action": "delete",
 | 
						|
        },
 | 
						|
    "description": "this is a description",
 | 
						|
    "enabled": 1,
 | 
						|
    "regions":
 | 
						|
        [
 | 
						|
            {
 | 
						|
                "quotas":
 | 
						|
                    [],
 | 
						|
                "users":
 | 
						|
                    [
 | 
						|
                        {
 | 
						|
                            "id": "userId1",
 | 
						|
                            "roles":
 | 
						|
                                [
 | 
						|
                                    "admin",
 | 
						|
                                    "other"
 | 
						|
                                ]
 | 
						|
                        },
 | 
						|
                        {"id": "userId2",
 | 
						|
                         "roles":
 | 
						|
                             [
 | 
						|
                                 "storage"
 | 
						|
                             ]
 | 
						|
                         }
 | 
						|
                    ],
 | 
						|
                "name": "regionname",
 | 
						|
                "action": "create"
 | 
						|
            },
 | 
						|
            {
 | 
						|
                "quotas":
 | 
						|
                    [
 | 
						|
                        {
 | 
						|
                            "compute":
 | 
						|
                                {
 | 
						|
                                    "instances": "10",
 | 
						|
                                    "ram": "10",
 | 
						|
                                    "keypairs": "10"
 | 
						|
                                },
 | 
						|
                            "storage":
 | 
						|
                                {
 | 
						|
                                    "gigabytes": "10",
 | 
						|
                                    "snapshots": "10",
 | 
						|
                                    "volumes": "10"
 | 
						|
                                },
 | 
						|
                            "network":
 | 
						|
                                {
 | 
						|
                                    "router": "10",
 | 
						|
                                    "floatingip": "10",
 | 
						|
                                    "port": "10",
 | 
						|
                                    "network": "10",
 | 
						|
                                    "subnet": "10"
 | 
						|
                                }
 | 
						|
                        }
 | 
						|
                    ],
 | 
						|
                "users":
 | 
						|
                    [],
 | 
						|
                "name": "regionnametest",
 | 
						|
                "action": "delete"
 | 
						|
            }
 | 
						|
        ],
 | 
						|
    "name": "welcome_man"
 | 
						|
}
 | 
						|
 | 
						|
flavorjsondata = {
 | 
						|
    "status": "complete",
 | 
						|
    "profile": "P2",
 | 
						|
    "regions": [
 | 
						|
        {
 | 
						|
            "name": "North1",
 | 
						|
            "action": "create"
 | 
						|
        },
 | 
						|
        {
 | 
						|
            "name": "North2",
 | 
						|
            "action": "delete"
 | 
						|
        }
 | 
						|
    ],
 | 
						|
    "description": "First flavor for AMAR",
 | 
						|
    "ram": 64,
 | 
						|
    "visibility": "public",
 | 
						|
    "extra_specs": {
 | 
						|
        "key1": "value1",
 | 
						|
        "key2": "value2",
 | 
						|
        "keyx": "valuex"
 | 
						|
    },
 | 
						|
    "vcpus": 2,
 | 
						|
    "swap": 0,
 | 
						|
    "tenants": [
 | 
						|
        {
 | 
						|
            "tenant_id": "abcd-efgh-ijkl-4567"
 | 
						|
        },
 | 
						|
        {
 | 
						|
            "tenant_id": "abcd-efgh-ijkl-4567"
 | 
						|
        }
 | 
						|
    ],
 | 
						|
    "disk": 512,
 | 
						|
    "empheral": 1,
 | 
						|
    "id": "uuid-uuid-uuid-uuid",
 | 
						|
    "name": "Nice Flavor"
 | 
						|
}
 | 
						|
 | 
						|
json_data = {
 | 
						|
    "uuid": "1e24981a-fa51-11e5-86aa-5e5517507c66",
 | 
						|
    "default_region": {
 | 
						|
        "users": [
 | 
						|
            {
 | 
						|
                "id": "userId1zzzz",
 | 
						|
                "roles": [
 | 
						|
                    "adminzzzz",
 | 
						|
                    "otherzzzzz"
 | 
						|
                ]
 | 
						|
            },
 | 
						|
            {
 | 
						|
                "id": "userId2zzz",
 | 
						|
                "roles": [
 | 
						|
                    "storagezzzzz"
 | 
						|
                ]
 | 
						|
            }
 | 
						|
        ],
 | 
						|
        "name": "regionnamezzzz",
 | 
						|
        "action": "create",
 | 
						|
        "quotas": [
 | 
						|
            {
 | 
						|
                "storage": {
 | 
						|
                    "gigabytes": "111",
 | 
						|
                    "volumes": "111",
 | 
						|
                    "snapshots": "111"
 | 
						|
                },
 | 
						|
                "compute": {
 | 
						|
                    "instances": "111",
 | 
						|
                    "ram": "111",
 | 
						|
                    "keypairs": "111"
 | 
						|
                },
 | 
						|
                "network": {
 | 
						|
                    "port": "111",
 | 
						|
                    "router": "111",
 | 
						|
                    "subnet": "111",
 | 
						|
                    "network": "111",
 | 
						|
                    "floatingip": "111"
 | 
						|
                }
 | 
						|
            }
 | 
						|
        ]
 | 
						|
    },
 | 
						|
    "description": "this is a description",
 | 
						|
    "enabled": 1,
 | 
						|
    "regions": [
 | 
						|
        {
 | 
						|
            "users": [
 | 
						|
                {
 | 
						|
                    "id": "userId1",
 | 
						|
                    "roles": [
 | 
						|
                        "admin",
 | 
						|
                        "other"
 | 
						|
                    ]
 | 
						|
                },
 | 
						|
                {
 | 
						|
                    "id": "userId2",
 | 
						|
                    "roles": [
 | 
						|
                        "storage"
 | 
						|
                    ]
 | 
						|
                }
 | 
						|
            ],
 | 
						|
            "name": "regionname",
 | 
						|
            "action": "delete",
 | 
						|
            "quotas": []
 | 
						|
        },
 | 
						|
        {
 | 
						|
            "users": [],
 | 
						|
            "name": "regionnametest",
 | 
						|
            "action": "modify",
 | 
						|
            "quotas": [
 | 
						|
                {
 | 
						|
                    "storage": {
 | 
						|
                        "gigabytes": "10",
 | 
						|
                        "volumes": "10",
 | 
						|
                        "snapshots": "10"
 | 
						|
                    },
 | 
						|
                    "compute": {
 | 
						|
                        "instances": "10",
 | 
						|
                        "ram": "10",
 | 
						|
                        "keypairs": "10"
 | 
						|
                    },
 | 
						|
                    "network": {
 | 
						|
                        "port": "10",
 | 
						|
                        "router": "10",
 | 
						|
                        "subnet": "10",
 | 
						|
                        "network": "10",
 | 
						|
                        "floatingip": "10"
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            ]
 | 
						|
        }
 | 
						|
    ],
 | 
						|
    "name": "welcome_man"
 | 
						|
}
 | 
						|
 | 
						|
target_list = [{'region_id': 'regionname',
 | 
						|
                'resource_type': 'customer',
 | 
						|
                'resource_name': '1e24981a-fa51-11e5-86aa-5e5517507c66',
 | 
						|
                'template_data': ['anystring'],
 | 
						|
                'operation': 'create'},
 | 
						|
               {'region_id': 'regionnametest',
 | 
						|
                'resource_name': '1e24981a-fa51-11e5-86aa-5e5517507c66',
 | 
						|
                'resource_type': 'customer',
 | 
						|
                'template_data': 'delete',
 | 
						|
                'operation': 'delete'}]
 | 
						|
 | 
						|
targets = [{'name': 'regionname', "action": "create",
 | 
						|
            'users': [{'id': 'userId1', 'roles': ['admin', 'other']},
 | 
						|
                      {'id': 'userId2', 'roles': ['storage']}],
 | 
						|
            'domain_name': 'default',
 | 
						|
            'quotas': []},
 | 
						|
           {'name': 'regionnametest', "action": "delete",
 | 
						|
            'users': [],
 | 
						|
            'domain_name': 'default',
 | 
						|
            'quotas': [{'storage': {'gigabytes': '10', 'volumes': '10',
 | 
						|
                                    'snapshots': '10'},
 | 
						|
                        'compute': {'instances': '10', 'ram': '10',
 | 
						|
                                    'keypairs': '10'},
 | 
						|
                        'network': {'port': '10',
 | 
						|
                                    'router': '10',
 | 
						|
                                    'subnet': '10',
 | 
						|
                                    'network': '10',
 | 
						|
                                    'floatingip': '10'}}]}]
 | 
						|
 | 
						|
json_data_image = {
 | 
						|
    "internal_id": 1,
 | 
						|
    "id": "uuu1id12-uuid-uuid-uuid",
 | 
						|
    "name": "Ubuntu",
 | 
						|
    "enabled": 1,
 | 
						|
    "protected": 1,
 | 
						|
    "url": "https://mirrors.it.att.com/images/image-name",
 | 
						|
    "visibility": "public",
 | 
						|
    "disk_format": "raw",
 | 
						|
    "container_format": "bare",
 | 
						|
    "min_disk": 2,
 | 
						|
    "min_ram": 0,
 | 
						|
    "regions": [
 | 
						|
        {
 | 
						|
            "name": "North",
 | 
						|
            "type": "single",
 | 
						|
            "action": "delete",
 | 
						|
            "image_internal_id": 1
 | 
						|
        },
 | 
						|
        {
 | 
						|
            "name": "North",
 | 
						|
            "action": "create",
 | 
						|
            "type": "single",
 | 
						|
            "image_internal_id": 1
 | 
						|
        }
 | 
						|
    ],
 | 
						|
    "image_properties": [
 | 
						|
        {
 | 
						|
            "key_name": "Key1",
 | 
						|
            "key_value": "Key1.value",
 | 
						|
            "image_internal_id": 1
 | 
						|
        },
 | 
						|
        {
 | 
						|
            "key_name": "Key2",
 | 
						|
            "key_value": "Key2.value",
 | 
						|
            "image_internal_id": 1
 | 
						|
        }
 | 
						|
    ],
 | 
						|
    "image_tenant": [
 | 
						|
        {
 | 
						|
            "tenant_id": "abcd-efgh-ijkl-4567",
 | 
						|
            "image_internal_id": 1
 | 
						|
        },
 | 
						|
        {
 | 
						|
            "tenant_id": "abcd-efgh-ijkl-4567",
 | 
						|
            "image_internal_id": 1
 | 
						|
        }
 | 
						|
    ],
 | 
						|
    "image_tags": [
 | 
						|
        {
 | 
						|
            "tag": "abcd-efgh-ijkl-4567",
 | 
						|
            "image_internal_id": 1
 | 
						|
        },
 | 
						|
        {
 | 
						|
            "tag": "abcd-efgh-ijkl-4567",
 | 
						|
            "image_internal_id": 1
 | 
						|
        }
 | 
						|
    ],
 | 
						|
    "status": "complete",
 | 
						|
}
 | 
						|
 | 
						|
input_data_resource = {'resource_id': '1e24981a-fa51-11e5-86aa-5e5517507c66',
 | 
						|
                       'targets': [
 | 
						|
                           {'action': 'create', 'quotas': [],
 | 
						|
                            'name': 'regionname',
 | 
						|
                            'users': [
 | 
						|
                                {'id': 'userId1', 'roles': ['admin', 'other']},
 | 
						|
                                {'id': 'userId2', 'roles': ['storage']}]},
 | 
						|
                           {'action': 'delete',
 | 
						|
                            'quotas': [{
 | 
						|
                                'storage': {
 | 
						|
                                    'gigabytes': '10',
 | 
						|
                                    'volumes': '10',
 | 
						|
                                    'snapshots': '10'},
 | 
						|
                                'compute': {
 | 
						|
                                    'instances': '10',
 | 
						|
                                    'ram': '10',
 | 
						|
                                    'keypairs': '10'},
 | 
						|
                                'network': {
 | 
						|
                                    'subnet': '10',
 | 
						|
                                    'router': '10',
 | 
						|
                                    'port': '10',
 | 
						|
                                    'network': '10',
 | 
						|
                                    'floatingip': '10'}}],
 | 
						|
                            'name': 'regionnametest',
 | 
						|
                            'users': []}],
 | 
						|
                       'resource_type': 'customer',
 | 
						|
                       'model': {
 | 
						|
                           'uuid': '1e24981a-fa51-11e5-86aa-5e5517507c66',
 | 
						|
                           'default_region': {'action': 'delete',
 | 
						|
                                              'quotas': [{'storage': {
 | 
						|
                                                  'gigabytes': '10',
 | 
						|
                                                  'volumes': '10',
 | 
						|
                                                  'snapshots': '10'},
 | 
						|
                                                  'compute': {
 | 
						|
                                                      'instances': '10',
 | 
						|
                                                      'ram': '10',
 | 
						|
                                                      'keypairs': '10'},
 | 
						|
                                                  'network': {
 | 
						|
                                                      'subnet': '10',
 | 
						|
                                                      'router': '10',
 | 
						|
                                                      'port': '10',
 | 
						|
                                                      'network': '10',
 | 
						|
                                                      'floatingip': '10'}}],
 | 
						|
                                              'name': 'regionnamezzzz',
 | 
						|
                                              'users': [
 | 
						|
                                                  {'id': 'userId1zzzz',
 | 
						|
                                                   'roles': ['adminzzzz',
 | 
						|
                                                             'otherzzzzz']},
 | 
						|
                                                  {'id': 'userId2zzz',
 | 
						|
                                                   'roles': [
 | 
						|
                                                       'storagezzzzz']}]},
 | 
						|
                           'description': 'this is a description',
 | 
						|
                           'enabled': 1, 'regions': [
 | 
						|
                               {'action': 'create', 'quotas': [],
 | 
						|
                                'name': 'regionname',
 | 
						|
                                'users': [{'id': 'userId1',
 | 
						|
                                           'roles': ['admin', 'other']},
 | 
						|
                                          {'id': 'userId2',
 | 
						|
                                           'roles': ['storage']}]},
 | 
						|
                               {'action': 'delete',
 | 
						|
                                'quotas': [{'storage': {'gigabytes': '10',
 | 
						|
                                                        'volumes': '10',
 | 
						|
                                                        'snapshots': '10'},
 | 
						|
                                            'compute': {'instances': '10',
 | 
						|
                                                        'ram': '10',
 | 
						|
                                                        'keypairs': '10'},
 | 
						|
                                            'network': {'subnet': '10',
 | 
						|
                                                        'router': '10',
 | 
						|
                                                        'port': '10',
 | 
						|
                                                        'network': '10',
 | 
						|
                                                        'floatingip': '10'}}],
 | 
						|
                                'name': 'regionnametest', 'users': []}],
 | 
						|
                           'name': 'welcome_man'},
 | 
						|
                       'external_transaction_id': 'uuid-12345',
 | 
						|
                       'operation': 'create',
 | 
						|
                       'transaction_id': ''}
 | 
						|
 | 
						|
expected_image_input_data = {
 | 
						|
    'resource_id': 'uuu1id12-uuid-uuid-uuid',
 | 
						|
    'targets': [
 | 
						|
        {
 | 
						|
            'action': 'delete', 'image_internal_id': 1,
 | 
						|
            'type': 'single', 'name': 'North'},
 | 
						|
        {
 | 
						|
            'action': 'create', 'image_internal_id': 1,
 | 
						|
            'type': 'single', 'name': 'North'}],
 | 
						|
    'resource_type': 'image',
 | 
						|
    'model': {
 | 
						|
        'status': 'complete', 'name': 'Ubuntu',
 | 
						|
        'internal_id': 1,
 | 
						|
        'url': 'https://mirrors.it.att.com/images/image-name',
 | 
						|
        'disk_format': 'raw', 'min_ram': 0,
 | 
						|
        'enabled': 1, 'visibility': 'public',
 | 
						|
        'image_tags': [
 | 
						|
            {'image_internal_id': 1, 'tag': 'abcd-efgh-ijkl-4567'},
 | 
						|
            {'image_internal_id': 1, 'tag': 'abcd-efgh-ijkl-4567'}],
 | 
						|
        'regions': [
 | 
						|
            {
 | 
						|
                'action': 'delete', 'image_internal_id': 1,
 | 
						|
                'type': 'single', 'name': 'North'},
 | 
						|
            {
 | 
						|
                'action': 'create', 'image_internal_id': 1,
 | 
						|
                'type': 'single', 'name': 'North'}],
 | 
						|
        'image_properties': [
 | 
						|
            {
 | 
						|
                'key_name': 'Key1',
 | 
						|
                'key_value': 'Key1.value',
 | 
						|
                'image_internal_id': 1},
 | 
						|
            {
 | 
						|
                'key_name': 'Key2',
 | 
						|
                'key_value': 'Key2.value',
 | 
						|
                'image_internal_id': 1}],
 | 
						|
        'protected': 1, 'image_tenant': [
 | 
						|
            {'tenant_id': 'abcd-efgh-ijkl-4567', 'image_internal_id': 1},
 | 
						|
            {'tenant_id': 'abcd-efgh-ijkl-4567', 'image_internal_id': 1}],
 | 
						|
        'container_format': 'bare',
 | 
						|
        'min_disk': 2,
 | 
						|
        'id': 'uuu1id12-uuid-uuid-uuid'},
 | 
						|
    'external_transaction_id': 'uuid-12345',
 | 
						|
    'operation': 'create', 'transaction_id': ''}
 |