1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from openstack import exceptions
from openstack import resource
from openstack import utils
class Cluster(resource.Resource):
resources_key = 'clusters'
base_path = '/clusters'
# capabilities
allow_create = True
allow_fetch = True
allow_commit = True
allow_delete = True
allow_list = True
allow_patch = True
commit_method = 'PATCH'
commit_jsonpatch = True
#: The endpoint URL of COE API exposed to end-users.
api_address = resource.Body('api_address')
#: The UUID of the cluster template.
cluster_template_id = resource.Body('cluster_template_id')
#: Version info of chosen COE in bay/cluster for helping client in picking
#: the right version of client.
coe_version = resource.Body('coe_version')
#: The timeout for cluster creation in minutes. The value expected is a
#: positive integer. If the timeout is reached during cluster creation
#: process, the operation will be aborted and the cluster status will be
#: set to CREATE_FAILED. Defaults to 60.
create_timeout = resource.Body('create_timeout', type=int)
#: The date and time when the resource was created. The date and time stamp
#: format is ISO 8601::
#:
#: CCYY-MM-DDThh:mm:ss±hh:mm
#:
#: For example, `2015-08-27T09:49:58-05:00`. The ±hh:mm value, if included,
#: is the time zone as an offset from UTC.
created_at = resource.Body('created_at')
#: The custom discovery url for node discovery. This is used by the COE to
#: discover the servers that have been created to host the containers. The
#: actual discovery mechanism varies with the COE. In some cases, the
#: service fills in the server info in the discovery service. In other
#: cases,if the discovery_url is not specified, the service will use the
#: public discovery service at https://discovery.etcd.io. In this case, the
#: service will generate a unique url here for each bay and store the info
#: for the servers.
discovery_url = resource.Body('discovery_url')
#: The name or ID of the network to provide connectivity to the internal
#: network for the bay/cluster.
fixed_network = resource.Body('fixed_network')
#: The fixed subnet to use when allocating network addresses for nodes in
#: bay/cluster.
fixed_subnet = resource.Body('fixed_subnet')
#: The flavor name or ID to use when booting the node servers. Defaults to
#: m1.small.
flavor_id = resource.Body('flavor_id')
#: Whether to enable using the floating IP of cloud provider. Some cloud
#: providers use floating IPs while some use public IPs. When set to true,
#: floating IPs will be used. If this value is not provided, the value of
#: ``floating_ip_enabled`` provided in the template will be used.
is_floating_ip_enabled = resource.Body('floating_ip_enabled', type=bool)
#: Whether to enable the master load balancer. Since multiple masters may
#: exist in a bay/cluster, a Neutron load balancer is created to provide
#: the API endpoint for the bay/cluster and to direct requests to the
#: masters. In some cases, such as when the LBaaS service is not available,
#: this option can be set to false to create a bay/cluster without the load
#: balancer. In this case, one of the masters will serve as the API
#: endpoint. The default is true, i.e. to create the load balancer for the
#: bay.
is_master_lb_enabled = resource.Body('master_lb_enabled', type=bool)
#: The name of the SSH keypair to configure in the bay/cluster servers for
#: SSH access. Users will need the key to be able to ssh to the servers in
#: the bay/cluster. The login name is specific to the bay/cluster driver.
#: For example, with fedora-atomic image the default login name is fedora.
keypair = resource.Body('keypair')
#: Arbitrary labels. The accepted keys and valid values are defined in the
#: bay/cluster drivers. They are used as a way to pass additional
#: parameters that are specific to a bay/cluster driver.
labels = resource.Body('labels', type=dict)
#: A list of floating IPs of all master nodes.
master_addresses = resource.Body('master_addresses', type=list)
#: The number of servers that will serve as master for the bay/cluster. Set
#: to more than 1 master to enable High Availability. If the option
#: master-lb-enabled is specified in the baymodel/cluster template, the
#: master servers will be placed in a load balancer pool. Defaults to 1.
master_count = resource.Body('master_count', type=int)
#: The flavor of the master node for this baymodel/cluster template.
master_flavor_id = resource.Body('master_flavor_id')
#: Name of the resource.
name = resource.Body('name')
#: The number of servers that will serve as node in the bay/cluster.
#: Defaults to 1.
node_count = resource.Body('node_count', type=int)
#: A list of floating IPs of all servers that serve as nodes.
node_addresses = resource.Body('node_addresses', type=list)
#: The reference UUID of orchestration stack from Heat orchestration
#: service.
stack_id = resource.Body('stack_id')
#: The current state of the bay/cluster.
status = resource.Body('status')
#: The reason of bay/cluster current status.
status_reason = resource.Body('reason')
#: The date and time when the resource was updated. The date and time stamp
#: format is ISO 8601::
#:
#: CCYY-MM-DDThh:mm:ss±hh:mm
#:
#: For example, `2015-08-27T09:49:58-05:00`. The ±hh:mm value, if included,
#: is the time zone as an offset from UTC. If the updated_at date and time
#: stamp is not set, its value is null.
updated_at = resource.Body('updated_at')
#: The UUID of the cluster.
uuid = resource.Body('uuid', alternate_id=True)
def resize(self, session, *, node_count, nodes_to_remove=None):
"""Resize the cluster.
:param node_count: The number of servers that will serve as node in the
bay/cluster. The default is 1.
:param nodes_to_remove: The server ID list will be removed if
downsizing the cluster.
:returns: The UUID of the resized cluster.
:raises: :exc:`~openstack.exceptions.NotFoundException` if
the resource was not found.
"""
url = utils.urljoin(Cluster.base_path, self.id, 'actions', 'resize')
headers = {'Accept': ''}
body = {
'node_count': node_count,
'nodes_to_remove': nodes_to_remove,
}
response = session.post(url, json=body, headers=headers)
exceptions.raise_from_response(response)
return response['uuid']
def upgrade(self, session, *, cluster_template, max_batch_size=None):
"""Upgrade the cluster.
:param cluster_template: The UUID of the cluster template.
:param max_batch_size: The max batch size each time when doing upgrade.
The default is 1
:returns: The UUID of the updated cluster.
:raises: :exc:`~openstack.exceptions.NotFoundException` if
the resource was not found.
"""
url = utils.urljoin(Cluster.base_path, self.id, 'actions', 'upgrade')
headers = {'Accept': ''}
body = {
'cluster_template': cluster_template,
'max_batch_size': max_batch_size,
}
response = session.post(url, json=body, headers=headers)
exceptions.raise_from_response(response)
return response['uuid']
|