diff --git a/compass/deployment/deploy_manager.py b/compass/deployment/deploy_manager.py index 8d52ff7d..37a2ecf9 100644 --- a/compass/deployment/deploy_manager.py +++ b/compass/deployment/deploy_manager.py @@ -35,12 +35,11 @@ class DeployManager(object): # Get OS installer os_installer_name = adapter_info[const.OS_INSTALLER][const.NAME] - os_hosts_info = self._get_hosts_for_os_installation(hosts_info) self.os_installer = DeployManager._get_installer(OSInstaller, os_installer_name, adapter_info, cluster_info, - os_hosts_info) + hosts_info) # Get package installer pk_info = adapter_info.setdefault(const.PK_INSTALLER, {}) @@ -148,18 +147,6 @@ class DeployManager(object): if self.pk_installer: self.pk_installer.delete_hosts(delete_cluster=delete_cluster) - def _get_hosts_for_os_installation(self, hosts_info): - """Get info of hosts which need to install/reinstall OS.""" - hosts_list = {} - for host_id in hosts_info: - reinstall_os_flag = hosts_info[host_id][const.REINSTALL_OS_FLAG] - if not reinstall_os_flag: - continue - - hosts_list[host_id] = hosts_info[host_id] - - return hosts_list - class PowerManager(object): """Manage host to power on, power off, and reset.""" diff --git a/compass/deployment/installers/config_manager.py b/compass/deployment/installers/config_manager.py index 8d48bad6..11b6997f 100644 --- a/compass/deployment/installers/config_manager.py +++ b/compass/deployment/installers/config_manager.py @@ -59,6 +59,15 @@ class BaseConfigManager(object): return self.hosts_info.keys() + def get_hosts_id_list_for_os_installation(self): + """Get info of hosts which need to install/reinstall OS.""" + result = [] + all_host_ids = self.get_host_id_list() + for host_id in all_host_ids: + if self.hosts_info[host_id][const.REINSTALL_OS_FLAG]: + result.append(host_id) + return result + def get_cluster_flavor_info(self): return self.__get_cluster_item(const.FLAVOR, {}) diff --git a/compass/deployment/installers/os_installers/cobbler/cobbler.py b/compass/deployment/installers/os_installers/cobbler/cobbler.py index 7406b813..e31734d6 100644 --- a/compass/deployment/installers/os_installers/cobbler/cobbler.py +++ b/compass/deployment/installers/os_installers/cobbler/cobbler.py @@ -117,7 +117,7 @@ class CobblerInstaller(OSInstaller): } } """ - host_ids = self.config_manager.get_host_id_list() + host_ids = self.config_manager.get_hosts_id_list_for_os_installation() if not host_ids: # No hosts need to install OS logging.info("Cobbler: No host needs to install OS.") diff --git a/compass/tests/deployment/test_deploy_manager.py b/compass/tests/deployment/test_deploy_manager.py index 325e6a36..eda00539 100644 --- a/compass/tests/deployment/test_deploy_manager.py +++ b/compass/tests/deployment/test_deploy_manager.py @@ -54,9 +54,3 @@ class TestDeployManager(unittest2.TestCase): test_manager = DeployManager(adapter_info, cluster_info, hosts_info) self.assertIsNotNone(test_manager) - - # Test hepler function _get_hosts_for_os_installation return correct - # number of hosts config for os deployment. In config_data, two out of - # three hosts need to install OS. - hosts_list = test_manager._get_hosts_for_os_installation(hosts_info) - self.assertEqual(2, len(hosts_list)) diff --git a/conf/flavor/openstack_chef.conf b/conf/flavor/openstack_chef.conf index 02f525cb..f98887b7 100644 --- a/conf/flavor/openstack_chef.conf +++ b/conf/flavor/openstack_chef.conf @@ -22,4 +22,14 @@ FLAVORS = [{ 'os-network-server', 'os-block-storage-controller', 'os-block-storage-volume', 'os-image', 'os-dashboard' ] +}, { + 'flavor': 'HA-multinodes', + 'display_name': 'Multi-node Cluster with HA', + 'template': 'ha_multinodes.tmpl', + 'roles': [ + 'os-ops-database', 'os-identity', 'os-ops-messaging', 'os-ha', + 'os-compute-controller', 'os-compute-worker', 'os-network-worker', + 'os-network-server', 'os-block-storage-controller', 'os-block-storage-volume', + 'os-image', 'os-dashboard' + ] }] diff --git a/conf/package_metadata/openstack.conf b/conf/package_metadata/openstack.conf index e357e983..639e4914 100644 --- a/conf/package_metadata/openstack.conf +++ b/conf/package_metadata/openstack.conf @@ -89,5 +89,16 @@ METADATA = { } } } + }, + 'ha_proxy': { + '_self': { + }, + 'vip': { + '_self': { + 'is_required': True, + 'field': 'general', + 'mapping_to': 'ha_vip' + } + } } } diff --git a/conf/role/openstack_chef.conf b/conf/role/openstack_chef.conf index b8da4f25..0c3dc837 100644 --- a/conf/role/openstack_chef.conf +++ b/conf/role/openstack_chef.conf @@ -57,7 +57,7 @@ ROLES = [{ 'display_name': 'dashboard node', 'description': 'dashboard node' }, { - 'role': 'ha-proxy', + 'role': 'os-ha', 'display_name': 'ha proxy node', 'description': 'ha proxy node', 'optional': True diff --git a/conf/templates/chef_installer/openstack_icehouse/environments/ha_multinodes.tmpl b/conf/templates/chef_installer/openstack_icehouse/environments/ha_multinodes.tmpl new file mode 100644 index 00000000..12b27762 --- /dev/null +++ b/conf/templates/chef_installer/openstack_icehouse/environments/ha_multinodes.tmpl @@ -0,0 +1,384 @@ +#set ha_vip = $getVar('ha_vip', None) +#if not ha_vip +#raise ValueError("ha_vip hasnot been set yet!") +#end if + +#set controller_role = $get_role('os_compute_controller', $getVar('os_controller', None)) + +## Contoller node management IP/interface +#set controller_ip = $controller_role.management.ip +#set controller_nic = $controller_role.management.interface + +## Compute node management IP/interface +#set compute_role = $getVar('os_compute_worker', None) +#set compute_nic = $compute_role.management.interface + +## Network server/worker node IP/interface +#set network = $getVar('os_network', None) +#set network_server_role = $get_role('os_network_server', [$network, $controller_role]) +#set network_worker_role = $get_role('os_network_worker', [$network, $compute_role]) + +#set network_server_ip = $network_server_role.management.ip +#set network_server_nic = $network_server_role.management.interface + +## Network worker node management IP/interface +#set network_worker_ip = $network_worker_role.management.ip +#set network_worker_nic = $network_worker_role.management.interface +#set network_worker_tenant_nic = $network_worker_role.tenant.interface +#set network_worker_public_nic = $network_worker_role.external.interface + +## Database node management IP +#set db_role = $get_role('os_ops_database', $controller_role) +#set db_ip = $db_role.management.ip +#set db_nic = $db_role.management.interface + +## Message queue node management IP/interface +#set msg_queue_role = $get_role('os_ops_messaging', $controller_role) +#set msg_queue_ip = $msg_queue_role.management.ip + +## Identity (keystone) node IP/interface +#set identity_role = $get_role('os_identity', $controller_role) +#set identity_ip = $identity_role.management.ip +#set identity_nic = $identity_role.management.interface + +## Glance node management IP/interface +#set glance_role = $get_role('os_image', $controller_role) +#set glance_ip = $glance_role.management.ip +#set glance_nic = $glance_role.management.interface + +## Cinder node management IP/interface +#set cinder_role = $get_role('os_block_storage_controller', $controller_role) +#set cinder_controller_ip = $cinder_role.management.ip +#set cinder_controller_nic = $cinder_role.management.interface + +## Dashboard node management IP/interface +#set dash_role = $get_role('os_dashboard', $controller_role) +#set dash_ip = $dash_role.management.ip + +#def get_role($role_name, $default_roles=None) + #set target_role = $getVar($role_name, None) + #if $target_role is None and $default_roles is not None + #if isinstance($default_roles, list) + #for $role in $default_roles + #if $role is not None + #set target_role = $role + #break + #end if + #end for + #else + #set target_role = $default_roles + #end if + #end if + #return $target_role +#end def +{ + "name": "testing", + "description": "Environment used in testing the upstream cookbooks and reference Chef repository", + "cookbook_versions": { + }, + "json_class": "Chef::Environment", + "chef_type": "environment", + "default_attributes": { + "local_repo": "", + "mysql": { + "server_root_password": "test", + "server_debian_password": "root", + "server_repl_password": "root", + "allow_remote_root": true, + "root_network_acl": "%" + }, + "collectd": { + "server": { + "host": "metrics", + "port": "2003", + "protocol": "udp" + } + }, + "haproxy": { + "incoming_address": "$ha_vip" + }, + "keepalived": { + "vip": { + "ipaddress": "$ha_vip", + "interface": "eth0" + } + }, + "openstack": { + "auth": { + "validate_certs": false + }, + "block-storage": { + "syslog": { + "use": false + }, + "api": { + "ratelimit": "False" + }, + "debug": true + }, + "dashboard": { + "use_ssl": "false" + }, + "compute": { + "syslog": { + "use": false + }, + "libvirt": { + "bind_interface": "$compute_nic" + }, + "novnc_proxy": { + "bind_interface": "$compute_nic" + }, + "xvpvnc_proxy": { + "bind_interface": "$compute_nic" + }, + "ratelimit": { + "api": { + "enabled": false + }, + "volume": { + "enabled": false + } + }, + "network": { + "service_type": "neutron" + } + }, + "network": { + "verbose": "True", + "debug": "True", + "service_plugins": [ + "router" + ], + "ml2": { + "type_drivers": "gre", + "tenant_network_types": "gre", + "tunnel_id_ranges": "1:1000", + "enable_security_group": "True" + }, + "openvswitch": { + "tenant_network_type": "gre", + "enable_tunneling": "True", + "tunnel_id_ranges": "1:1000", + "bind_interface": "$network_worker_tenant_nic" + }, + "l3": { + "external_network_bridge_interface": "$network_worker_public_nic" + } + }, + "db": { + "bind_interface": "$db_nic", + "compute": { + "host": "$db_ip" + }, + "identity": { + "host": "$db_ip" + }, + "image": { + "host": "$db_ip" + }, + "network": { + "host": "$db_ip" + }, + "volume": { + "host": "$db_ip" + }, + "dashboard": { + "host": "$db_ip" + }, + "telemetry": { + "host": "$db_ip" + }, + "orchestration": { + "host": "$db_ip" + } + }, + "developer_mode": true, + "endpoints": { + "db": { + "host": "$db_ip" + }, + "mq": { + "host": "$msg_queue_ip" + }, + "compute-api": { + "host": "$ha_vip", + "scheme": "http", + "port": "8774", + "path": "/v2/%(tenant_id)s" + }, + "compute-api-bind": { + "bind_interface": "$compute_nic" + }, + "compute-ec2-admin": { + "host": "$ha_vip", + "scheme": "http", + "port": "8773", + "path": "/services/Admin" + }, + "compute-ec2-api": { + "host": "$ha_vip", + "scheme": "http", + "port": "8773", + "path": "/services/Cloud" + }, + "compute-novnc": { + "host": "$ha_vip", + "scheme": "http", + "port": "6080", + "path": "/vnc_auto.html" + }, + "compute-novnc-bind": { + "bind_interface": "$controller_nic" + }, + "compute-vnc-bind": { + "bind_interface" : "$compute_nic" + }, + "vnc_bind": { + "bind_interface": "$controller_nic" + }, + "image-api": { + "host": "$ha_vip", + "scheme": "http", + "port": "9292", + "path": "/v2" + }, + "image-api-bind": { + "bind_interface": "$glance_nic" + }, + "image-registry": { + "host": "$ha_vip", + "scheme": "http", + "port": "9191", + "path": "/v2" + }, + "image-registry-bind": { + "bind_interface": "$glance_nic" + }, + "identity-bind": { + "bind_interface": "$identity_nic" + }, + "identity-api": { + "host": "$ha_vip", + "scheme": "http", + "port": "5000", + "path": "/v2.0" + }, + "identity-admin": { + "host": "$ha_vip", + "scheme": "http", + "port": "35357", + "path": "/v2.0" + }, + "block-storage-api": { + "host": "$ha_vip", + "scheme": "http", + "port": "8776", + "path": "/v1/%(tenant_id)s" + }, + "block-storage-api-bind": { + "bind_interface": "$cinder_controller_nic" + }, + "telemetry-api": { + "host": "$ha_vip", + "scheme": "http", + "port": "8777", + "path": "/v1" + }, + "network-api": { + "host": "$ha_vip", + "scheme": "http", + "port": "9696", + "path": "" + }, + "network-api-bind": { + "bind_interface": "$network_server_nic" + }, + "orchestration-api": { + "host": "$ha_vip", + "scheme": "http", + "port": "8004", + "path": "/v1/%(tenant_id)s" + }, + "orchestration-api-cfn": { + "host": "$ha_vip", + "scheme": "http", + "port": "8000", + "path": "/v1" + } + }, + "identity": { + "admin_user": "admin", + "bind_interface": "$identity_nic", + "catalog": { + "backend": "sql" + }, + "debug": true, + "roles": [ + "admin", + "member" + ], + "syslog": { + "use": false + }, + "tenants": [ + "admin", + "service", + "demo" + ], + "token": { + "backend": "sql" + }, + "users": { + "admin": { + "password": "admin", + "default_tenant": "admin", + "roles": { + "admin": [ + "admin" + ] + } + }, + "demo": { + "password": "demo", + "default_tenant": "demo", + "roles": { + "member": [ + "demo" + ] + } + } + } + }, + "image": { + "api": { + "bind_interface": "$glance_nic" + }, + "debug": true, + "registry": { + "bind_interface": "$glance_nic" + }, + "syslog": { + "use": false + }, + "upload_image": { + "cirros": "http://download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-disk.img" + }, + "upload_images": [ + "cirros" + ] + }, + "memcached": { + "bind_interface": "$identity_nic" + }, + "mq": { + "user": "guest", + "password": "test", + "vhost": "/nova", + "network": { + "service_type": "rabbitmq" + } + } + } + } +}