(function(angular) { 'use strict'; // OS::Nova::Server angular.module('horizon.dashboard.project.heat_dashboard.template_generator').value('osNovaServerSettings', { resource_key: "OS__Nova__Server", admin: false, icon: { class: 'fa-desktop ', name: 'OS::Nova::Server', code: '\uf108', color: '#483dff' }, label: 'name', modal_component: '', edge_settings: { 'OS__Cinder__Volume': { 'type': 'property', 'property': 'block_device_mapping_v2.volume_id', 'limit': 99, 'occupied': true, 'lonely': true, }, 'OS__Nova__KeyPair': { 'type': 'property', 'property': 'key_name', 'limit': 1, }, 'OS__Neutron__Net': { 'type': 'property', 'property': 'networks.network', 'limit': 99, }, 'OS__Neutron__FloatingIP': { 'type': 'property', 'property': 'networks.floating_ip', 'limit': 99, }, 'OS__Neutron__Subnet': { 'type': 'property', 'property': 'networks.subnet', 'limit': 99, }, 'OS__Neutron__Port': { 'type': 'property', 'property': 'networks.port', 'limit': 99, }, 'OS__Neutron__SecurityGroup': { 'type': 'property', 'property': 'security_groups', 'limit': 99, }, }, necessary_properties: { 'flavor': null } } ); angular.module('horizon.dashboard.project.heat_dashboard.template_generator') .run(['osNovaServerSettings', 'hotgenGlobals', function(osNovaServerSettings, hotgenGlobals){ hotgenGlobals.update_resource_icons( osNovaServerSettings.resource_key, osNovaServerSettings.icon); hotgenGlobals.update_node_labels( osNovaServerSettings.resource_key, osNovaServerSettings.label); hotgenGlobals.update_resource_components( osNovaServerSettings.resource_key, osNovaServerSettings.modal_component); // for (var i in osNovaServerSettings.edge_settings){ // if (osNovaServerSettings.edge_settings[i].modal){ // hotgenGlobals.update_resource_components( // osNovaServerSettings.resource_key+'_'+i, // osNovaServerSettings.edge_settings[i].modal); // } // } hotgenGlobals.update_edge_directions( osNovaServerSettings.resource_key, osNovaServerSettings.edge_settings); }]); function osNovaServerController($scope, hotgenGlobals, hotgenNotify, hotgenUtils, validationRules) { this.$onInit = function(){ if (typeof this.connectedoptions === 'undefined'){ $scope.connected_options = [] } else{ $scope.connected_options = this.connectedoptions; } if (typeof this.instance.metadata === 'undefined'){ this.instance.metadata = [{}]; } if (typeof this.instance.tags === 'undefined'){ this.instance.tags = []; } if (typeof this.instance.scheduler_hints === 'undefined'){ this.instance.scheduler_hints = [{}]; } if (typeof this.instance.personality === 'undefined'){ this.instance.personality = [{}]; } if (typeof this.instance.block_device_mapping === 'undefined'){ this.instance.block_device_mapping = []; } if (typeof this.instance.security_groups === 'undefined'){ this.instance.security_groups = []; } if (typeof this.instance.block_device_mapping_v2 === 'undefined'){ this.instance.block_device_mapping_v2 = []; } if (typeof this.instance.networks === 'undefined'){ this.instance.networks = []; } this.disable = { 'key_name': false, 'security_groups': [], 'block_device_mapping_v2.volume_id': [], 'networks': {}, } if (this.instance.image){ $scope.boot_source = 'image'; } else if (this.instance.image_snapshot){ $scope.boot_source = 'image_snapshot'; } else if (this.instance.volume){ $scope.boot_source = 'volume'; } else if (this.instance.volume_snapshot){ $scope.boot_source = 'volume_snapshot'; } if ( $scope.connected_options.key_name && $scope.connected_options.key_name.length > 0){ this.instance['key_name'] = $scope.connected_options.key_name[0].value; this.disable.key_name = true; } var old_array = hotgenUtils.filter_and_return_get_resource_element(this.instance['security_groups']); if ( $scope.connected_options.security_groups && $scope.connected_options.security_groups.length > 0){ for (var idx in $scope.connected_options.security_groups){ this.instance['security_groups'].push($scope.connected_options.security_groups[idx].value); this.disable.security_groups.push($scope.connected_options.security_groups[idx].value); } } var old_array = hotgenUtils.filter_and_return_get_resource_element(this.instance['block_device_mapping_v2'], 'volume_id'); var exist_volume_map = {} for (var idx in old_array){ if (old_array[idx].volume_id && old_array[idx].volume_id.length > 0 ){ exist_volume_map[old_array[idx].volume_id] = old_array[idx]; } } this.disable.length = 0; $scope.bdpv2_source = {}; if ( $scope.connected_options['block_device_mapping_v2.volume_id'] && $scope.connected_options['block_device_mapping_v2.volume_id'].length > 0){ for (var idx in $scope.connected_options['block_device_mapping_v2.volume_id']){ var connected_vol_id = $scope.connected_options['block_device_mapping_v2.volume_id'][idx].value; var item = exist_volume_map[connected_vol_id]; if (item == null){ item = {volume_id: connected_vol_id} } this.instance.block_device_mapping_v2.push(item); this.disable['block_device_mapping_v2.volume_id'].push(connected_vol_id); } } for (var idx in this.instance.block_device_mapping_v2){ var disk = this.instance.block_device_mapping_v2[idx]; var source = ''; if (disk.volume_id && disk.volume_id != '') { source = 'volume'; } else if (disk.image && disk.image != '') { source = 'image'; } else if (disk.snapshot_id && disk.snapshot_id != '') { source = 'volume_snapshot'; } $scope.bdpv2_source[idx.toString()] = source; } var old_net_array = hotgenUtils.filter_and_return_get_resource_element(this.instance['networks'], 'network'); var exist_network_map = {} for (var idx in old_net_array){ if (old_net_array[idx].network && old_net_array[idx].network.length > 0 ){ exist_network_map[old_net_array[idx].network] = old_net_array[idx]; } } var old_subnet_array = hotgenUtils.filter_and_return_get_resource_element(this.instance['networks'], 'subnet'); var exist_subnet_map = {} for (var idx in old_subnet_array){ if (old_subnet_array[idx].subnet && old_subnet_array[idx].subnet.length > 0 ){ exist_subnet_map[old_subnet_array[idx].subnet] = old_subnet_array[idx]; } } var old_port_array = hotgenUtils.filter_and_return_get_resource_element(this.instance['networks'], 'port'); var exist_port_map = {} for (var idx in old_port_array){ if (old_port_array[idx].port && old_port_array[idx].port.length > 0 ){ exist_port_map[old_port_array[idx].port] = old_port_array[idx]; } } var old_fip_array = hotgenUtils.filter_and_return_get_resource_element(this.instance['networks'], 'floating_ip'); var exist_fip_map = {} for (var idx in old_fip_array){ if (old_fip_array[idx].floating_ip && old_fip_array[idx].floating_ip.length > 0 ){ exist_fip_map[old_fip_array[idx].floating_ip] = old_fip_array[idx]; } } if ( $scope.connected_options['networks.network'] && $scope.connected_options['networks.network'].length > 0){ for (var idx in $scope.connected_options['networks.network']){ var connected_nw_id = $scope.connected_options['networks.network'][idx].value; var item = exist_network_map[connected_nw_id]; if (item == null){ item = {network: connected_nw_id} } this.disable.networks[this.instance.networks.length.toString()] = true; $scope.how2config_networks[this.instance.networks.length.toString()] = 'network'; this.instance.networks.push(item); } } if ( $scope.connected_options['networks.subnet'] && $scope.connected_options['networks.subnet'].length > 0){ for (var idx in $scope.connected_options['networks.subnet']){ var connected_subnet_id = $scope.connected_options['networks.subnet'][idx].value; var item = exist_subnet_map[connected_subnet_id]; if (item == null){ item = {subnet: connected_subnet_id} } this.disable.networks[this.instance.networks.length] = true; $scope.how2config_networks[this.instance.networks.length.toString()] = 'subnet'; this.instance.networks.push(item); } } if ( $scope.connected_options['networks.port'] && $scope.connected_options['networks.port'].length > 0){ for (var idx in $scope.connected_options['networks.port']){ var connected_port_id = $scope.connected_options['networks.port'][idx].value; var item = exist_port_map[connected_port_id]; if (item == null){ item = {port: connected_port_id} } this.disable.networks[this.instance.networks.length] = true; $scope.how2config_networks[this.instance.networks.length.toString()] = 'port'; this.instance.networks.push(item); } } if ( $scope.connected_options['networks.floating_ip'] && $scope.connected_options['networks.floating_ip'].length > 0){ for (var idx in $scope.connected_options['networks.floating_ip']){ var connected_fip_id = $scope.connected_options['networks.floating_ip'][idx].value; var item = exist_fip_map[connected_fip_id]; if (item == null){ item = {floating_ip: connected_fip_id} } this.disable.networks[this.instance.networks.length] = true; $scope.how2config_networks[this.instance.networks.length.toString()] = 'floating_ip'; this.instance.networks.push(item); } } for (var idx in this.instance.networks){ var netconfig = this.instance.networks[idx]; var source = ''; if (netconfig.network && netconfig.network != '') { source = 'network'; } else if (netconfig.subnet && netconfig.subnet != '') { source = 'subnet'; } else if (netconfig.port && netconfig.port != '') { source = 'port'; } else if (netconfig.floating_ip && netconfig.floating_ip != '') { source = 'floating_ip'; } $scope.how2config_networks[idx.toString()] = source; } $scope.update = { keypairs: $scope.get_keypairs_options(), networks: $scope.get_networks_options(), subnets: $scope.get_subnets_options(), floatingips: $scope.get_floatingips_options(), ports: $scope.get_ports_options(), security_groups: $scope.get_security_groups_options(), volumes: $scope.get_volumes_options(), } $scope.dependson = this.dependson; } $scope.show_passwd = false; $scope.show_passwd_type = "password"; $scope.bdpv2_source = {}; // Mark the source selected of every block_device_mapping_v2 item. $scope.how2config_networks = {} $scope.update_boot_source = function(){ if ($scope.boot_source == 'image'){ this.$ctrl.instance.image_snapshot = null; this.$ctrl.instance.volume = null; this.$ctrl.instance.volume_snapshot = null; } else if ($scope.boot_source == 'image_snapshot'){ this.$ctrl.instance.image = null; this.$ctrl.instance.volume = null; this.$ctrl.instance.volume_snapshot = null; } else if ($scope.boot_source == 'volume'){ this.$ctrl.instance.image = null; this.$ctrl.instance.image_snapshot = null; this.$ctrl.instance.volume_snapshot = null; } else if ($scope.boot_source == 'volume_snapshot'){ this.$ctrl.instance.image = null; this.$ctrl.instance.image_snapshot = null; this.$ctrl.instance.volume = null; } } $scope.update_source = function (index) { if ($scope.bdpv2_source[index] == 'volume'){ this.$ctrl.instance.block_device_mapping_v2[index].image = null; this.$ctrl.instance.block_device_mapping_v2[index].snapshot_id = null; } else if ($scope.bdpv2_source[index] == 'volume_snapshot'){ this.$ctrl.instance.block_device_mapping_v2[index].volume_id = null; this.$ctrl.instance.block_device_mapping_v2[index].image = null; } else if ($scope.bdpv2_source[index] == 'image'){ this.$ctrl.instance.block_device_mapping_v2[index].volume_id = null; this.$ctrl.instance.block_device_mapping_v2[index].snapshot_id = null; } } $scope.update_nwconfig = function (index) { if ($scope.how2config_networks[index] == 'network'){ this.$ctrl.instance.networks[index].subnet = null; this.$ctrl.instance.networks[index].port = null; this.$ctrl.instance.networks[index].floating_ip = null; } else if ($scope.how2config_networks[index] == 'subnet'){ this.$ctrl.instance.networks[index].network = null; this.$ctrl.instance.networks[index].port = null; this.$ctrl.instance.networks[index].floating_ip = null; } else if ($scope.how2config_networks[index] == 'port'){ this.$ctrl.instance.networks[index].subnet = null; this.$ctrl.instance.networks[index].network = null; this.$ctrl.instance.networks[index].floating_ip = null; } else if ($scope.how2config_networks[index] == 'floating_ip'){ this.$ctrl.instance.networks[index].subnet = null; this.$ctrl.instance.networks[index].port = null; this.$ctrl.instance.networks[index].network = null; } } $scope.$watch("show_passwd", function(newValue, oldValue) { $scope.show_passwd_type = $scope.show_passwd ? "text" : "password"; }); $scope.options = hotgenGlobals.get_resource_options(); $scope.get_security_groups_options = function(){ if ('security_groups' in $scope.connected_options){ var resource_secgroups = []; for (var idx in $scope.connected_options.security_groups){ var item = $scope.connected_options.security_groups[idx]; resource_secgroups.push({ id: item.value, name: item.value }) } return $scope.options.security_groups.concat(resource_secgroups); } return $scope.options.security_groups; } $scope.get_volumes_options = function(){ if ('block_device_mapping_v2.volume_id' in $scope.connected_options){ var resource_volumes = []; for (var idx in $scope.connected_options['block_device_mapping_v2.volume_id']){ var item = $scope.connected_options['block_device_mapping_v2.volume_id'][idx]; resource_volumes.push({ id: item.value, name: item.value }) } return $scope.options.volumes.concat(resource_volumes); } return $scope.options.volumes; } $scope.get_keypairs_options = function(){ if ('key_name' in $scope.connected_options){ var resource_keypair = []; for (var idx in $scope.connected_options.key_name){ var item = $scope.connected_options.key_name[idx]; resource_keypair.push({ name: item.value }) } return $scope.options.keypairs.concat(resource_keypair); } return $scope.options.keypairs; } $scope.get_networks_options = function(){ if ('networks.network' in $scope.connected_options){ var resource_nw = []; for (var idx in $scope.connected_options['networks.network']){ var item = $scope.connected_options['networks.network'][idx]; resource_nw.push({ id: item.value, name: item.value }) } return $scope.options.networks.concat(resource_nw); } return $scope.options.networks; } $scope.get_subnets_options = function(){ if ('networks.subnet' in $scope.connected_options){ var resource_subnet = []; for (var idx in $scope.connected_options['networks.subnet']){ var item = $scope.connected_options['networks.subnet'][idx]; resource_subnet.push({ id: item.value, name: item.value }) } return $scope.options.subnets.concat(resource_subnet); } return $scope.options.subnets; } $scope.get_floatingips_options = function(){ if ('networks.floating_ip' in $scope.connected_options){ var resource_fip = []; for (var idx in $scope.connected_options['networks.floating_ip']){ var item = $scope.connected_options['networks.floating_ip'][idx]; resource_fip.push({ id: item.value, }) } return $scope.options.floatingips.concat(resource_fip); } return $scope.options.floatingips; } $scope.get_ports_options = function(){ if ('networks.port' in $scope.connected_options){ var resource_port = []; for (var idx in $scope.connected_options['networks.port']){ var item = $scope.connected_options['networks.port'][idx]; resource_port.push({ id: item.value, name: item.value }) } return $scope.options.ports.concat(resource_port); } return $scope.options.ports; } $scope.block_device_mapping_v2 = true; $scope.deployment_swift_data = {}; $scope.show_more = false; $scope.options.boot_sources = [ {'id': 'image', 'name': 'image'}, {'id': 'image_snapshot', 'name': 'image snapshot'}, {'id': 'volume', 'name': 'volume'}, {'id': 'volume_snapshot', 'name': 'volume snapshot'} ]; $scope.options.volume_sources = [ {'id': 'volume', 'name': 'volume'}, {'id': 'volume_snapshot', 'name': 'volume snapshot'} ]; $scope.options.volume_sources_v2 = [ {'id': 'image', 'name': 'image'}, {'id': 'volume', 'name': 'volume'}, {'id': 'volume_snapshot', 'name': 'volume snapshot'} ]; $scope.options.flavor_update_policies = [ {'name': 'RESIZE', 'default': true}, {'name': 'REPLACE'}, ]; $scope.options.image_update_policies = [ {'name': 'REBUILD', 'default': true}, {'name': 'REPLACE'}, {'name': 'REBUILD_PRESERVE_EPHEMERAL'}, ]; $scope.options.disk_configs = [ {'name': 'AUTO', 'default': true}, {'name': 'MANUAL'}, ]; $scope.options.software_config_transports = [ {'name': 'POLL_SERVER_CFN', 'default': true}, {'name': 'POLL_SERVER_HEAT'}, {'name': 'POLL_TEMP_URL'}, {'name': 'ZAQAR_MESSAGE'}, ]; $scope.options.user_data_update_policies = [ {'name': 'REPLACE', 'default': true}, {'name': 'IGNORE'}, ]; $scope.options.user_data_formats = [ {'name': 'HEAT_CFNTOOLS', 'default': true}, {'name': 'RAW'}, {'name': 'SOFTWARE_CONFIG'} ]; $scope.options.disk_types = [ {'name': 'disk'}, {'name': 'cdrom'}, ] $scope.options.disk_buses = [ {'name': 'ide'}, {'name': 'lame_bus'}, {'name': 'scsi'}, {'name': 'usb'}, {'name': 'virtio'}, ]; $scope.options.ephemeral_formats = [ {'name': 'ext2'}, {'name': 'ext3'}, {'name': 'ext4'}, {'name': 'xfs'}, {'name': 'ntfs'}, ]; $scope.options.allocate_networks = [{'name': 'none'}, {'name': 'auto'}]; $scope.validate_name = validationRules['name']; $scope.validate_ip_address = validationRules['ip_address']; $scope.validate_uuid4 = validationRules['uuid4']; this.delete_metadata = function(index){ this.instance.metadata.splice(index, 1) } this.add_metadata = function(){ this.instance.metadata.push({}) } this.delete_personality = function(index){ this.instance.personality.splice(index, 1) } this.add_personality = function(){ this.instance.personality.push({}) } this.delete_block_device_mapping = function(index){ this.instance.block_device_mapping.splice(index, 1) } this.add_block_device_mapping = function(){ this.instance.block_device_mapping.push({}) } this.delete_block_device_mapping_v2 = function(index){ for (var i = index; i <= this.instance.block_device_mapping_v2.length; i=i+1){ $scope.bdpv2_source[i] = $scope.bdpv2_source[i+1]; } this.instance.block_device_mapping_v2.splice(index, 1) } this.add_block_device_mapping_v2 = function(){ this.instance.block_device_mapping_v2.push({}) } this.delete_networks = function(index){ for (var i = index; i < this.instance.networks.length; i=i+1){ $scope.how2config_networks[i] = $scope.how2config_networks[i+1]; } delete $scope.how2config_networks[this.instance.networks.length]; this.instance.networks.splice(index, 1); for (var i = index; i < this.instance.networks.length; i=i+1){ this.disable.networks[i] = this.disable.networks[i+1]; } delete this.disable.networks[this.instance.networks.length]; } this.add_networks = function(){ this.instance.networks.push({}) } this.delete_scheduler_hints = function(index){ this.instance.scheduler_hints.splice(index, 1) } this.add_scheduler_hints= function(){ this.instance.scheduler_hints.push({}) } } osNovaServerController.$inject = ['$scope', 'hotgenGlobals', 'hotgenNotify', 'hotgenUtils', 'horizon.dashboard.project.heat_dashboard.template_generator.validationRules', ]; osNovaServerPath.$inject = ['horizon.dashboard.project.heat_dashboard.template_generator.basePath']; function osNovaServerPath(basePath){ return basePath + 'js/resources/os__nova__server/os__nova__server.html'; } angular.module('horizon.dashboard.project.heat_dashboard.template_generator').component('osNovaServer', { templateUrl: osNovaServerPath, controller: osNovaServerController, bindings:{ 'instance': '=', 'dependson': '=', 'connectedoptions': '<', 'formReference': '<', } }); })(window.angular);