From d50641477a76f7a800d2982b445a8ad91cb63ecb Mon Sep 17 00:00:00 2001 From: John Hua Date: Tue, 10 Nov 2015 18:00:10 +0800 Subject: [PATCH] Migrate to Fuel 7.0 Migration basically will include kilo-based nova plugin, new release file, new deployment task file and new metadata file. As fuel plugin builder 3.0.0 will support post-install script, the customized fuel plugin builder (https://github.com/citrix-openstack/fuel-plugins) will be useless for XenServer Fuel Plugin building. Change-Id: I129b2f429165ef805ac3e8f6bf57383b09876e60 --- README.md | 23 +- deployment_scripts/compute_post_deployment.py | 8 +- .../{novaplugins.iso => novaplugins-kilo.iso} | Bin 419840 -> 419840 bytes deployment_tasks.yaml | 32 ++ metadata.yaml | 8 +- newrelease.yaml | 481 +++++++++++++++--- tasks.yaml | 24 - 7 files changed, 451 insertions(+), 125 deletions(-) rename deployment_scripts/{novaplugins.iso => novaplugins-kilo.iso} (93%) create mode 100644 deployment_tasks.yaml delete mode 100644 tasks.yaml diff --git a/README.md b/README.md index 878996c..490b15d 100644 --- a/README.md +++ b/README.md @@ -17,28 +17,7 @@ and [user guide](doc/content/user-guide.rst). How to build plugin =================== - -Install prerequisites ---------------------- - - apt-get install createrepo rpm dpkg-dev python-pip sshpass -y \ - || yum install createrepo rpm rpm-build dpkg-devel python-pip sshpass -y - - -Clone Citrix FPB ------------------- - -XenServer Fuel Plugin uses a forked Fuel Plugin Builder (FPB) to deploy a new OpenStack release during the installation of the plugin. -This is achieved by adding a post-install script option to the version 2.0 plugin. - + pip install fuel-plugin-builder git clone https://git.openstack.org/openstack/fuel-plugin-xenserver - sudo pip install fuel-plugins/fuel_plugin_builder/ - - - -Build and Check ---------------- - - git clone https://git.openstack.org/openstack/fuel-plugin-xenserver.git fpb --check fuel-plugin-xenserver fpb --build fuel-plugin-xenserver diff --git a/deployment_scripts/compute_post_deployment.py b/deployment_scripts/compute_post_deployment.py index 072d6e2..2fd3578 100755 --- a/deployment_scripts/compute_post_deployment.py +++ b/deployment_scripts/compute_post_deployment.py @@ -36,7 +36,7 @@ def execute(*cmd, **kwargs): if out: debug(out) - if proc.returncode != 0: + if proc.returncode is not None and proc.returncode != 0: warning(err) raise Exception(err) @@ -216,11 +216,11 @@ def route_to_compute(endpoints, himn_xs, himn_local, username, password): def install_suppack(himn, username, password): """Install xapi driver supplemental pack. """ # TODO: check if installed - scp(himn, username, password, '/tmp/', 'novaplugins.iso') + scp(himn, username, password, '/tmp/', 'novaplugins-kilo.iso') out = ssh( himn, username, password, 'xe-install-supplemental-pack', - '/tmp/novaplugins.iso', prompt='Y\n') - ssh(himn, username, password, 'rm', '/tmp/novaplugins.iso') + '/tmp/novaplugins-kilo.iso', prompt='Y\n') + ssh(himn, username, password, 'rm', '/tmp/novaplugins-kilo.iso') def forward_from_himn(eth): diff --git a/deployment_scripts/novaplugins.iso b/deployment_scripts/novaplugins-kilo.iso similarity index 93% rename from deployment_scripts/novaplugins.iso rename to deployment_scripts/novaplugins-kilo.iso index 68d97c8a371a9fbd4fddde14cfc2dc4f71531768..1fc0c4ca8f91ffd330793dd6c8e0ebf9b1ab62f9 100644 GIT binary patch delta 23881 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 diff --git a/deployment_tasks.yaml b/deployment_tasks.yaml new file mode 100644 index 0000000..e169eff --- /dev/null +++ b/deployment_tasks.yaml @@ -0,0 +1,32 @@ +- id: 'install-pv-tool' + role: ['compute'] + required_for: ['compute-post-deployment'] + requires: ['post_deployment_start'] + type: shell + parameters: + cmd: 'dpkg -i ./xe-guest-utilities_6.5.0-1393_amd64.deb' + timeout: 10 +- id: 'install-sshpass' + role: ['compute'] + required_for: ['compute-post-deployment'] + requires: ['post_deployment_start'] + type: shell + parameters: + cmd: 'apt-get install sshpass -y' + timeout: 60 +- id: 'compute-post-deployment' + role: ['compute'] + required_for: ['post_deployment_end'] + requires: ['install-pv-tool', 'install-sshpass'] + type: shell + parameters: + cmd: ./compute_post_deployment.py + timeout: 300 +- id: 'controller-post-deployment' + role: ['primary-controller'] + required_for: ['post_deployment_end'] + requires: ['post_deployment_start'] + type: shell + parameters: + cmd: ./controller_post_deployment.sh + timeout: 300 \ No newline at end of file diff --git a/metadata.yaml b/metadata.yaml index 4daf397..06ffeb7 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -3,11 +3,11 @@ name: fuel-plugin-xenserver # Human-readable name for your plugin title: XenServer Plugin # Plugin version -version: '1.0.2' +version: '2.0.0' # Description description: Enable Mirantis OpenStack to integrate with Xenserver # Required fuel version -fuel_version: ['6.1'] +fuel_version: ['7.0'] # Specify license of your plugin licenses: ['Apache License Version 2.0'] # Specify author or company name @@ -21,11 +21,11 @@ groups: ['network','hypervisor'] # The plugin is compatible with releases in the list releases: - os: ubuntu - version: 2014.2.2-6.1 + version: '2015.1.0-7.0' mode: ['multinode', 'ha'] deployment_scripts_path: deployment_scripts/ repository_path: repositories/ubuntu # Version of plugin package -package_version: '2.0.0' +package_version: '3.0.0' diff --git a/newrelease.yaml b/newrelease.yaml index ffdb10a..4dc1090 100644 --- a/newrelease.yaml +++ b/newrelease.yaml @@ -6,26 +6,19 @@ modes_metadata: ha_compact: description: "This configuration Deploys OpenStack ready for high availability (HA). Controller services are prepared for HA by setting up a base MySQL/Galera, RabbitMQ and HAProxy so that additional controllers can be deployed NOW, or scaled out LATER. 3 or more controllers are required for a true HA environment." - multinode: - description: "In this configuration the OpenStack controller is deployed separately from the compute and cinder nodes. This mode assumes the presence of 1 controller node and 1 or more compute/cinder nodes. You can add more nodes to scale your cloud later." - roles: - - controller - - compute - - cinder - - cinder-vmware - - ceph-osd - - mongo - - base-os roles_metadata: controller: name: "Controller" description: "The Controller initiates orchestration activities and provides an external API. Other components like Glance (image storage), Keystone (identity management), Horizon (OpenStack dashboard) and Nova-Scheduler are installed on the controller as well." + weight: 10 conflicts: - compute update_required: - compute - cinder has_primary: true + public_ip_required: true + public_for_dvr_required: true limits: min: 1 overrides: @@ -34,17 +27,20 @@ message: "Multi-node environment can not have more than one Controller node." - condition: "cluster:mode == 'ha_compact'" recommended: 3 - message: "At least 3 Controller nodes are recommended for HA deployment." + message: "At least 3 Controller nodes are recommended for Highly Available (HA) environments. Deployments with less than 3 Controller nodes are not recommended for production environments." compute: name: "Compute" - description: "A Compute node creates, manages and terminates virtual machine instances." + description: "A Compute node creates, manages, and terminates virtual machine instances." + weight: 20 + public_for_dvr_required: true limits: recommended: 1 fault_tolerance: "2%" cinder: # NOTE: naming, see https://bugs.launchpad.net/fuel/+bug/1383224 name: "Storage - Cinder" - description: "Cinder provides scheduling of block storage resources, typically delivered over iSCSI and other compatible backend storage systems. Block storage can be used for database storage, expandable file systems, or providing a server with access to raw block level devices." + description: "Cinder provides scheduling of block storage resources, typically delivered over iSCSI and other compatible backend storage systems. Block storage can be used for database storage, expandable file systems, or to provide a server with access to raw block level devices." + weight: 30 limits: recommended: 1 restrictions: @@ -55,7 +51,8 @@ message: "Ceph RBD cannot be used with Cinder" cinder-vmware: name: "Storage - Cinder Proxy to VMware Datastore" - description: "Cinder-VMware provides scheduling of block storage resources delivered over VMWare vCenter. Block storage can be used for database storage, expandable file systems, or providing a server with access to raw block level devices." + description: "Cinder-VMware provides scheduling of block storage resources delivered over VMware vCenter. Block storage can be used for database storage, expandable file systems, or providing a server with access to raw block level devices." + weight: 40 limits: recommended: 1 restrictions: @@ -64,6 +61,7 @@ ceph-osd: name: "Storage - Ceph OSD" description: "Ceph storage can be configured to provide storage for block volumes (Cinder), images (Glance) and ephemeral instance storage (Nova). It can also provide object storage through the S3 and Swift API (See settings to enable each)." + weight: 50 limits: min: "settings:storage.osd_pool_size.value" restrictions: @@ -74,6 +72,7 @@ mongo: name: "Telemetry - MongoDB" description: "A feature-complete and recommended database for storage of metering data from OpenStack Telemetry (Ceilometer)." + weight: 60 conflicts: - compute - ceph-osd @@ -88,8 +87,6 @@ recommended: 3 message: "At least 3 MongoDB nodes are recommended for HA deployment." restrictions: - - condition: "cluster:status == 'operational'" - message: "MongoDB node can not be added to an operational environment." - condition: "settings:additional_components.ceilometer.value == false" message: "Ceilometer should be enabled." - condition: "settings:additional_components.mongo.value == true" @@ -97,6 +94,209 @@ base-os: name: "Operating System" description: "Install base Operating System without additional packages and configuration." + weight: 70 + virt: + name: "Virtual" + description: "ADVANCED: Make available possibilities to spawn vms on this node that can be assign as a normal nodes." + weight: 80 + public_ip_required: true + conflicts: + - controller + - base-os + restrictions: + - condition: "not ('advanced' in version:feature_groups)" + action: "hide" + compute-vmware: + name: "Compute VMware" + description: "A node that runs nova-compute with VCDriver, that manages ESXi computing resources via VMware vCenter." + weight: 90 + conflicts: "*" + restrictions: + - condition: "settings:common.use_vcenter.value == false" + action: "hide" + ironic: + name: "Ironic" + description: "Ironic conductor" + weight: 100 + limits: + min: 1 + recommended: 3 + conflicts: + - compute + restrictions: + - condition: "settings:additional_components.ironic.value == false" + message: "Ironic should be enabled." + + network_roles_metadata: + - + id: "keystone/api" + default_mapping: "management" + properties: &default_network_roles_metadata_properties + subnet: true + gateway: false + vip: [] + - + id: "admin/pxe" + default_mapping: "fuelweb_admin" + properties: + subnet: true + gateway: true + vip: [] + - + id: "swift/api" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "neutron/api" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "sahara/api" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "ceilometer/api" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "cinder/api" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "glance/api" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "heat/api" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "nova/api" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "murano/api" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "horizon" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "mgmt/memcache" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "mgmt/database" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "mgmt/messaging" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "mgmt/corosync" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "mgmt/vip" + default_mapping: "management" + properties: + subnet: true + gateway: false + vip: + - + name: "vrouter" + namespace: "vrouter" + alias: "management_vrouter_vip" + - + name: "management" + namespace: "haproxy" + alias: "management_vip" + - + id: "public/vip" + default_mapping: "public" + properties: + subnet: true + gateway: true + vip: + - + name: "vrouter_pub" + namespace: "vrouter" + alias: "public_vrouter_vip" + - + name: "public" + namespace: "haproxy" + alias: "public_vip" + - + id: "neutron/private" + default_mapping: "private" + properties: + subnet: false + gateway: false + vip: [] + - + id: "neutron/mesh" + default_mapping: "private" + properties: *default_network_roles_metadata_properties + - + id: "neutron/floating" + default_mapping: "public" + properties: + subnet: false + gateway: false + vip: [] + - + id: "swift/replication" + default_mapping: "storage" + properties: *default_network_roles_metadata_properties + - + id: "ceph/public" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "ceph/radosgw" + default_mapping: "public" + properties: *default_network_roles_metadata_properties + - + id: "ceph/replication" + default_mapping: "storage" + properties: *default_network_roles_metadata_properties + - + id: "cinder/iscsi" + default_mapping: "storage" + properties: *default_network_roles_metadata_properties + - + id: "mongo/db" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "fw-admin" + default_mapping: "fuelweb_admin" + properties: + subnet: true + gateway: true + vip: [] + - + id: "management" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + - + id: "ex" + default_mapping: "public" + properties: + subnet: true + gateway: true + vip: [] + - + id: "storage" + default_mapping: "storage" + properties: *default_network_roles_metadata_properties + - + id: "nova/migration" + default_mapping: "management" + properties: *default_network_roles_metadata_properties + networks_metadata: bonding: availability: @@ -105,7 +305,10 @@ properties: linux: mode: - - values: ["balance-rr", "active-backup", "802.3ad"] + - values: ["balance-rr", "active-backup"] + - values: ["802.3ad"] + condition: "'experimental' in version:feature_groups or + interface:pxe == false" - values: ["balance-xor", "broadcast", "balance-tlb", "balance-alb"] condition: "'experimental' in version:feature_groups" xmit_hash_policy: @@ -213,7 +416,17 @@ use_gateway: false notation: "cidr" render_type: "cidr" - render_addr_mask: "private" + render_addr_mask: null + map_priority: 2 + configurable: true + - name: "private" + seg_type: "tun" + cidr: "192.168.2.0/24" + vlan_start: 103 + use_gateway: false + notation: "cidr" + render_type: "cidr" + render_addr_mask: null map_priority: 2 configurable: true config: @@ -244,7 +457,9 @@ volumes_roles_mapping: controller: - {allocate_size: "min", id: "os"} + - {allocate_size: "min", id: "logs"} - {allocate_size: "all", id: "image"} + - {allocate_size: "min", id: "mysql"} compute: - {allocate_size: "min", id: "os"} - {allocate_size: "all", id: "vm"} @@ -268,6 +483,13 @@ # https://bugs.launchpad.net/fuel/+bug/1278964 base-os: - {allocate_size: "min", id: "os"} + virt: + - {allocate_size: "min", id: "os"} + - {allocate_size: "all", id: "vm"} + compute-vmware: + - {allocate_size: "min", id: "os"} + ironic: + - {allocate_size: "all", id: "os"} volumes: - id: "os" type: "vg" @@ -284,6 +506,20 @@ name: "swap" size: {generator: "calc_swap_size"} file_system: "swap" + - id: "logs" + type: "vg" + min_size: + generator: "calc_gb_to_mb" + generator_args: [10] + label: "Logs" + volumes: + - mount: "/var/log" + type: "lv" + name: "log" + size: + generator: "calc_total_vg" + generator_args: ["logs"] + file_system: "ext4" - id: "mongo" type: "vg" label: "MongoDB" @@ -366,7 +602,7 @@ weight: 10 type: "text" regex: - source: &user_tenant_blacklist '^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.* +.*$).+' + source: &user_tenant_blacklist '^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?!ironic$)(?![Gg]uest$)(?!.* +.*$).+' error: "Invalid username" email: value: "admin@localhost" @@ -421,6 +657,7 @@ weight: 20 restrictions: - condition: "settings:additional_components.murano.value == false" + message: "Murano is not enabled on the Additional Components section" action: "hide" murano_repo_url: value: "http://storage.apps.openstack.org/" @@ -434,6 +671,7 @@ weight: 20 restrictions: - condition: "settings:additional_components.mongo.value == false" + message: "Ceilometer and MongoDB are not enabled on the Additional Components section" action: "hide" hosts_ip: value: "" @@ -525,17 +763,12 @@ description: "If selected, Sahara component will be installed" weight: 10 type: "checkbox" - restrictions: - - condition: "true" - action: disable murano: value: false label: "Install Murano" description: "If selected, Murano component will be installed" weight: 20 type: "checkbox" - restrictions: - - "cluster:net_provider != 'neutron'" heat: value: true label: "" @@ -548,9 +781,6 @@ description: "If selected, Ceilometer component will be installed" weight: 40 type: "checkbox" - restrictions: - - condition: "true" - action: disable mongo: value: false label: "Use external Mongo DB" @@ -559,6 +789,15 @@ type: "checkbox" restrictions: - "settings:additional_components.ceilometer.value == false" + ironic: + value: false + label: "Install Ironic" + description: "If selected, Ironic component will be installed" + weight: 50 + type: "checkbox" + restrictions: + - "cluster:net_provider != 'neutron' or networking_parameters:segmentation_type != 'vlan'": "Ironic requires Neutron with VLAN segmentation." + - "settings:storage.images_ceph.value == true": "Ironic requires Swift as a backend for Glance image service." common: metadata: label: "Common" @@ -594,6 +833,8 @@ value: false weight: 30 type: "hidden" + restrictions: + - condition: "cluster:net_provider == 'nova_network'" libvirt_type: value: "qemu" values: @@ -637,6 +878,30 @@ description: "When disabled, public network will be assigned to controllers only" weight: 10 type: "checkbox" + neutron_advanced_configuration: + metadata: + weight: 45 + label: "Neutron Advanced Configuration" + restrictions: + - condition: "cluster:net_provider != 'neutron'" + action: "hide" + neutron_l2_pop: + value: false + label: "Neutron L2 population" + description: "Enable L2 population mechanism in Neutron" + weight: 10 + type: "checkbox" + restrictions: + - condition: "networking_parameters:segmentation_type == 'vlan'" + action: "hide" + neutron_dvr: + value: false + label: "Neutron DVR" + description: "Enable Distributed Virtual Routers in Neutron" + weight: 20 + type: "checkbox" + restrictions: + - "networking_parameters:segmentation_type != 'vlan' and settings:neutron_advanced_configuration.neutron_l2_pop.value == false": "DVR requires L2 population to be enabled." corosync: metadata: label: "Corosync" @@ -666,6 +931,8 @@ metadata: label: "Syslog" weight: 50 + toggleable: true + enabled: false syslog_transport: value: "tcp" values: @@ -684,6 +951,9 @@ description: "Remote syslog hostname" weight: 10 type: "text" + regex: + source: &ipv4_or_hostname_regex '^[a-zA-Z\d]+[-\.\da-zA-Z]*$' + error: "Invalid hostname" syslog_port: value: "514" label: "Port" @@ -692,23 +962,17 @@ type: "text" regex: source: "^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$" - error: "Invalid Syslog port" + error: "Invalid syslog port" provision: metadata: label: "Provision" weight: 80 + restrictions: + - condition: "true" + action: "hide" method: - type: "radio" - label: "Provision method" - description: "Which provision method to use for this cluster." + type: "hidden" value: "image" - values: - - data: "image" - label: "Image" - description: "Copying pre-built images on a disk." - - data: "cobbler" - label: "(DEPRECATED) Classic (use anaconda or debian-installer)" - description: "Install from scratch using anaconda or debian-installer." external_dns: metadata: label: "Host OS DNS Servers" @@ -739,12 +1003,62 @@ regex: source: '^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$' error: "Invalid NTP server list" + public_ssl: + metadata: + label: "Public TLS" + weight: 110 + horizon: + value: true + label: "HTTPS for Horizon" + description: "Secure access to Horizon enabling HTTPS instead of HTTP" + weight: 10 + type: "checkbox" + services: + value: true + label: "TLS for OpenStack public endpoints" + description: "Enable TLS termination on HAProxy for OpenStack services" + weight: 20 + type: "checkbox" + cert_source: + type: "radio" + weight: 30 + label: "Select source for certificate" + description: "From where we'll get certificate and private key" + value: "self_signed" + values: + - data: "self_signed" + label: "Self-signed" + description: "Generate private key and certificate that will be signed by this key" + - data: "user_uploaded" + label: "I have my own keypair with certificate" + description: "Use pre-generated key and certificate" + restrictions: + - condition: "settings:public_ssl.horizon.value == false and settings:public_ssl.services.value == false" + action: "hide" + cert_data: + value: "" + label: "Certificate" + description: "Certificate and private key data, concatenated into a single file" + weight: 40 + type: "file" + restrictions: + - condition: "(settings:public_ssl.cert_source.value != 'user_uploaded') or (settings:public_ssl.horizon.value == false and settings:public_ssl.services.value == false)" + action: "hide" + hostname: + value: "public.fuel.local" + label: "DNS hostname for public TLS endpoints" + description: "Your DNS entries should point to this name. Self-signed certificates also will use this hostname" + weight: 50 + type: "text" + restrictions: + - condition: "settings:public_ssl.horizon.value == false and settings:public_ssl.services.value == false" + action: "hide" kernel_params: metadata: label: "Kernel parameters" weight: 40 kernel: - value: "console=ttyS0,9600 console=tty0 biosdevname=0 rootdelay=90 nomodeset" + value: "console=tty0 biosdevname=0 rootdelay=90 nomodeset" label: "Initial parameters" description: "Default kernel parameters" weight: 45 @@ -789,7 +1103,7 @@ - "settings:storage.images_vcenter.value == true": "Only one Glance backend could be selected." images_vcenter: value: false - label: "VMWare vCenter/ESXi datastore for images (Glance)" + label: "VMware vCenter/ESXi datastore for images (Glance)" description: "Configures Glance to use the vCenter/ESXi backend to store images. If enabled, this option will prevent Swift from installing." weight: 35 type: "checkbox" @@ -910,6 +1224,13 @@ metadata: metadata_proxy_shared_secret: generator: "password" + ironic: + user_password: + generator: "password" + db_password: + generator: "password" + swift_tempurl_key: + generator: "password" puppet: manifests: "rsync://{settings.MASTER_IP}:/puppet/{cluster.release.version}/manifests/" modules: "rsync://{settings.MASTER_IP}:/puppet/{cluster.release.version}/modules/" @@ -958,24 +1279,26 @@ type: "radio" values: - data: "neutron-vlan" - label: "dialog.create_cluster_wizard.network.neutr_vlan" - description: "dialog.create_cluster_wizard.network.neutr_vlan_description" + label: "common.network.neutron_vlan" + description: "dialog.create_cluster_wizard.network.neutron_vlan_description" restrictions: - "Compute.vcenter == true": "dialog.create_cluster_wizard.network.hypervisor_alert" bind: - "cluster:net_provider": "neutron" - "cluster:net_segment_type": "vlan" - - data: "neutron-gre" - label: "dialog.create_cluster_wizard.network.neutr_gre" - description: "dialog.create_cluster_wizard.network.neutr_gre_description" + - data: "neutron-tun" + label: "common.network.neutron_tun" + description: "dialog.create_cluster_wizard.network.neutron_tun_description" restrictions: - "Compute.vcenter == true": "dialog.create_cluster_wizard.network.hypervisor_alert" bind: - "cluster:net_provider": "neutron" - - "cluster:net_segment_type": "gre" + - "cluster:net_segment_type": "tun" - data: "nova-network" label: "dialog.create_cluster_wizard.network.nova_network" description: "dialog.create_cluster_wizard.network.nova_network_description" + restrictions: + - "Compute.vcenter == false": "dialog.create_cluster_wizard.network.nove_network_vcenter_alert" bind: - "cluster:net_provider": "nova_network" Storage: @@ -1011,14 +1334,21 @@ description: "dialog.create_cluster_wizard.additional.install_murano_description" bind: "settings:additional_components.murano.value" weight: 20 - restrictions: - - "Network.manager == 'nova-network'": "dialog.create_cluster_wizard.additional.network_mode_alert" ceilometer: type: "checkbox" label: "dialog.create_cluster_wizard.additional.install_ceilometer" description: "dialog.create_cluster_wizard.additional.install_ceilometer_description" bind: "settings:additional_components.ceilometer.value" weight: 30 + ironic: + type: "checkbox" + label: "dialog.create_cluster_wizard.additional.install_ironic" + description: "dialog.create_cluster_wizard.additional.install_ironic_description" + bind: "settings:additional_components.ironic.value" + weight: 40 + restrictions: + - "Network.manager != 'neutron-vlan'": "dialog.create_cluster_wizard.additional.ironic_network_mode_alert" + - "Storage.ceph == 'enable'": "dialog.create_cluster_wizard.additional.ironic_storage_mode_alert" Ready: {} vmware_attributes_metadata: editable: @@ -1037,14 +1367,14 @@ description: "Availability zone name" regex: source: &availability_zone_blacklist '^(?!nova$)\w+$' - error: "Invalid Availability zone name" + error: "Invalid availability zone name" - name: "vcenter_host" type: "text" label: "vCenter host" description: "vCenter host or IP" regex: - source: &ipv4_or_hostname_regex '^[a-zA-Z\d]+[-\.\da-zA-Z]*$' + source: *ipv4_or_hostname_regex error: "Invalid vCenter host" - name: "vcenter_username" @@ -1069,18 +1399,18 @@ - name: "vsphere_cluster" type: "text" - label: "VSphere cluster" - description: "VSphere cluster" + label: "vSphere cluster" + description: "vSphere cluster" regex: source: *non_empty_string - error: "Invalid VSphere cluster" + error: "Invalid vSphere cluster" - name: "service_name" type: "text" label: "Service name" description: "Service name" regex: - source: '^\w+$' + source: '^\w[\w\-]+$' error: "Invalid service name" - name: "datastore_regex" @@ -1090,6 +1420,11 @@ regex: source: *non_empty_string error: "Invalid datastore regex" + - + name: "target_node" + type: "select" + label: "Target node" + description: "Target node for nova-compute service" - name: "network" type: "object" @@ -1104,7 +1439,7 @@ description: "VLAN interface" regex: source: *non_empty_string - error: "Invalid Network Interface" + error: "Invalid network interface" - name: "glance" type: "object" @@ -1143,7 +1478,7 @@ description: "Datacenter" regex: source: *non_empty_string - error: "Invalid Datacenter" + error: "Invalid datacenter" - name: "datastore" type: "text" @@ -1151,7 +1486,7 @@ description: "Datastore" regex: source: *non_empty_string - error: "Invalid Datastore" + error: "Invalid datastore" value: availability_zones: - @@ -1164,6 +1499,13 @@ vsphere_cluster: "" service_name: "" datastore_regex: "" + target_node: + options: + - id: "controllers" + label: "controllers" + current: + id: "controllers" + label: "controllers" cinder: enable: true network: @@ -1175,18 +1517,15 @@ datacenter: "" datastore: "" modes: ['ha_compact'] + extensions: ['volume_manager'] - pk: 9 extend: *base_release fields: - name: "Juno+Citrix XenServer on Ubuntu 14.04.1" - version: "2014.2.2-6.1" + name: "Kilo+Citrix XenServer on Ubuntu 14.04" + version: "2015.1.0-7.0" can_update_from_versions: [] operating_system: "Ubuntu" - description: "This option will install the OpenStack Juno packages using Ubuntu as a base operating system. With high availability features built in, you are getting a robust, enterprise-grade OpenStack deployment." - roles: - - controller - - compute - - cinder + description: "This option will install the OpenStack Kilo packages using Ubuntu as a base operating system. With high availability features built in, you are getting a robust, enterprise-grade OpenStack deployment." roles_metadata: controller: name: "Controller" @@ -1264,25 +1603,25 @@ - type: "deb" name: "mos" uri: "http://{settings.MASTER_IP}:8080/{cluster.release.version}/ubuntu/x86_64" - suite: "mos6.1" + suite: "mos7.0" section: "main restricted" priority: 1050 - type: "deb" name: "mos-updates" - uri: "http://mirror.fuel-infra.org/mos/ubuntu/" - suite: "mos6.1-updates" + uri: "http://mirror.fuel-infra.org/mos-repos/ubuntu/{cluster.release.environment_version}/" + suite: "mos7.0-updates" section: "main restricted" priority: 1050 - type: "deb" name: "mos-security" - uri: "http://mirror.fuel-infra.org/mos/ubuntu/" - suite: "mos6.1-security" + uri: "http://mirror.fuel-infra.org/mos-repos/ubuntu/{cluster.release.environment_version}/" + suite: "mos7.0-security" section: "main restricted" priority: 1050 - type: "deb" name: "mos-holdback" - uri: "http://mirror.fuel-infra.org/mos/ubuntu/" - suite: "mos6.1-holdback" + uri: "http://mirror.fuel-infra.org/mos-repos/ubuntu/{cluster.release.environment_version}/" + suite: "mos7.0-holdback" section: "main restricted" priority: 1100 - type: "deb" diff --git a/tasks.yaml b/tasks.yaml deleted file mode 100644 index f961f1a..0000000 --- a/tasks.yaml +++ /dev/null @@ -1,24 +0,0 @@ -- role: ['compute'] - stage: pre_deployment/6000 - type: shell - parameters: - cmd: 'dpkg -i ./xe-guest-utilities_6.5.0-1393_amd64.deb' - timeout: 10 -- role: ['compute'] - stage: pre_deployment/6001 - type: shell - parameters: - cmd: 'apt-get install sshpass -y' - timeout: 60 -- role: ['compute'] - stage: post_deployment/50 - type: shell - parameters: - cmd: ./compute_post_deployment.py - timeout: 300 -- role: ['primary-controller'] - stage: post_deployment/100 - type: shell - parameters: - cmd: ./controller_post_deployment.sh - timeout: 300 \ No newline at end of file