File: cluster.py

package info (click to toggle)
python-openstacksdk 4.4.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,352 kB
  • sloc: python: 122,960; sh: 153; makefile: 23
file content (168 lines) | stat: -rw-r--r-- 8,132 bytes parent folder | download
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']