diff --git a/sample/tile.yml b/sample/tile.yml index 7fa57973..c6673a71 100644 --- a/sample/tile.yml +++ b/sample/tile.yml @@ -390,6 +390,9 @@ packages: max_in_flight: 1 properties: password: red!s + instance_definition: + constraints: + min: 2 - name: sanity-tests templates: - name: sanity-tests diff --git a/tile_generator/config.py b/tile_generator/config.py index ff072a82..69bf8e4a 100644 --- a/tile_generator/config.py +++ b/tile_generator/config.py @@ -327,6 +327,19 @@ def latest_stemcell(self, os): return latest_major return None # TODO - Look for latest on bosh.io for given os + def _build_instance_definition(self, job): + instance_def = { + 'configurable': True, + 'default': job.get('instances', 1), + 'name': 'instances', + 'type': 'integer' + } + if job.get('singleton') or job.get('lifecycle') == 'errand': + instance_def['configurable'] = False + instance_def['default'] = 1 + merge_dict(instance_def, job.get('instance_definition', {})) + return instance_def + def normalize_jobs(self): for release in self.get('releases', {}).values(): for job in release.get('jobs', []): @@ -334,6 +347,7 @@ def normalize_jobs(self): job['template'] = job.get('template', job['type']) job['properties'] = job.get('properties', {}) job['manifest'] = self.build_job_manifest(job) + job['instance_definition'] = self._build_instance_definition(job) def build_job_manifest(self, job): # TODO: This whole thing needs to be changed to new world order diff --git a/tile_generator/test_config_expected_output.json b/tile_generator/test_config_expected_output.json index f116f66f..5e1f138c 100644 --- a/tile_generator/test_config_expected_output.json +++ b/tile_generator/test_config_expected_output.json @@ -1027,6 +1027,15 @@ "default_internet_connected": false, "dynamic_ip": 1, "ephemeral_disk": 4096, + "instance_definition": { + "configurable": true, + "constraints": { + "min": 2 + }, + "default": 2, + "name": "instances", + "type": "integer" + }, "instances": 2, "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -1204,6 +1213,12 @@ "cpu": 2, "dynamic_ip": 1, "ephemeral_disk": 4096, + "instance_definition": { + "configurable": false, + "default": 1, + "name": "instances", + "type": "integer" + }, "lifecycle": "errand", "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -1406,6 +1421,12 @@ "jobs": [ { "dynamic_ip": 1, + "instance_definition": { + "configurable": true, + "default": 1, + "name": "instances", + "type": "integer" + }, "instances": 1, "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -1616,6 +1637,12 @@ }, { "dynamic_ip": 1, + "instance_definition": { + "configurable": true, + "default": 1, + "name": "instances", + "type": "integer" + }, "instances": 1, "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -1829,6 +1856,12 @@ "jobs": [ { "dynamic_ip": 1, + "instance_definition": { + "configurable": true, + "default": 1, + "name": "instances", + "type": "integer" + }, "instances": 1, "manifest": { "app_instances": "(( .properties.app_instances.value ))", @@ -2058,6 +2091,12 @@ "is_cf": true, "jobs": [ { + "instance_definition": { + "configurable": false, + "default": 1, + "name": "instances", + "type": "integer" + }, "lifecycle": "errand", "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -2228,6 +2267,12 @@ "type": "deploy-all" }, { + "instance_definition": { + "configurable": false, + "default": 1, + "name": "instances", + "type": "integer" + }, "lifecycle": "errand", "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -2390,6 +2435,12 @@ "type": "delete-all" }, { + "instance_definition": { + "configurable": true, + "default": 1, + "name": "instances", + "type": "integer" + }, "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", "app_domains": [ @@ -3003,7 +3054,7 @@ "files": [ { "name": "utils.sh", - "path": "/home/user/Work/tile-generator/tile_generator/templates/src/common/utils.sh" + "path": "/Users/mboldt/pivotal/tile-generator/tile_generator/templates/src/common/utils.sh" } ], "name": "common" @@ -3019,6 +3070,15 @@ "default_internet_connected": false, "dynamic_ip": 1, "ephemeral_disk": 4096, + "instance_definition": { + "configurable": true, + "constraints": { + "min": 2 + }, + "default": 2, + "name": "instances", + "type": "integer" + }, "instances": 2, "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -3196,6 +3256,12 @@ "cpu": 2, "dynamic_ip": 1, "ephemeral_disk": 4096, + "instance_definition": { + "configurable": false, + "default": 1, + "name": "instances", + "type": "integer" + }, "lifecycle": "errand", "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -3387,6 +3453,12 @@ "jobs": [ { "dynamic_ip": 1, + "instance_definition": { + "configurable": true, + "default": 1, + "name": "instances", + "type": "integer" + }, "instances": 1, "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -3597,6 +3669,12 @@ }, { "dynamic_ip": 1, + "instance_definition": { + "configurable": true, + "default": 1, + "name": "instances", + "type": "integer" + }, "instances": 1, "manifest": { "allow_paid_service_plans": "(( .properties.allow_paid_service_plans.value ))", @@ -3810,6 +3888,12 @@ "jobs": [ { "dynamic_ip": 1, + "instance_definition": { + "configurable": true, + "default": 1, + "name": "instances", + "type": "integer" + }, "instances": 1, "manifest": { "app_instances": "(( .properties.app_instances.value ))", diff --git a/tile_generator/test_metadata_expected_output.yml b/tile_generator/test_metadata_expected_output.yml index 10277295..1caa0525 100644 --- a/tile_generator/test_metadata_expected_output.yml +++ b/tile_generator/test_metadata_expected_output.yml @@ -996,6 +996,8 @@ job_types: dynamic_ip: 1 instance_definition: configurable: true + constraints: + min: 2 default: 2 name: instances type: integer diff --git a/tile_generator/tile_metadata.py b/tile_generator/tile_metadata.py index 0abda4cc..2c043879 100644 --- a/tile_generator/tile_metadata.py +++ b/tile_generator/tile_metadata.py @@ -591,19 +591,10 @@ def _build_job_types(self): if job.get('default_internet_connected') != None: bosh_release_job['default_internet_connected'] = job.get('default_internet_connected') - instance_def = { - 'configurable': True, - 'default': job.get('instances', 1), - 'name': 'instances', - 'type': 'integer' - } - if job.get('singleton') or job.get('lifecycle') == 'errand': - instance_def['configurable'] = False - instance_def['default'] = 1 if self.config['metadata_version'] < 1.7: - bosh_release_job['instance_definitions'] = [instance_def] + bosh_release_job['instance_definitions'] = [job.get('instance_definition')] else: - bosh_release_job['instance_definition'] = instance_def + bosh_release_job['instance_definition'] = job.get('instance_definition') job_types.append(bosh_release_job)