def update_enabled(self, user, enabled): """ Update enabled-ness """ params = {"user": {"id": base.getid(user), "enabled": enabled}} self._update("/users/%s/OS-KSADM/enabled" % base.getid(user), params, "user")
def update_password(self, user, password): """ Update password """ params = {"user": {"id": base.getid(user), "password": password}} return self._update("/users/%s/OS-KSADM/password" % base.getid(user), params, "user")
def roles_for_user(self, user, tenant=None): user_id = base.getid(user) if tenant: tenant_id = base.getid(tenant) route = "/tenants/%s/users/%s/roles" return self._list(route % (tenant_id, user_id), "roles") else: return self._list("/users/%s/roles" % user_id, "roles")
def update_tenant(self, user, tenant): """ Update default tenant. """ params = {"user": {"id": base.getid(user), "tenantId": base.getid(tenant)}} # FIXME(ja): seems like a bad url - default tenant is an attribute # not a subresource!??? return self._update("/users/%s/OS-KSADM/tenant" % base.getid(user), params, "user")
def update(self, user, **kwargs): """ Update user data. Supported arguments include ``name``, ``email``, and ``enabled``. """ # FIXME(gabriel): "tenantId" seems to be accepted by the API but # fails to actually update the default tenant. params = {"user": kwargs} params['user']['id'] = base.getid(user) url = "/users/%s" % base.getid(user) return self._update(url, params, "user")
def update_tenant(self, user, tenant): """ Update default tenant. """ params = { "user": { "id": base.getid(user), "tenantId": base.getid(tenant) } } # FIXME(ja): seems like a bad url - default tenant is an attribute # not a subresource!??? return self._update("/users/%s/OS-KSADM/tenant" % base.getid(user), params, "user")
def add_user_role(self, user, role, tenant=None): """ Adds a role to a user. If tenant is specified, the role is added just for that tenant, otherwise the role is added globally. """ user_id = base.getid(user) role_id = base.getid(role) if tenant: route = "/tenants/%s/users/%s/roles/OS-KSADM/%s" params = (base.getid(tenant), user_id, role_id) return self._update(route % params, None, "role") else: route = "/users/%s/roles/OS-KSADM/%s" return self._update(route % (user_id, role_id), None, "roles")
def remove_user_role(self, user, role, tenant=None): """ Removes a role from a user. If tenant is specified, the role is removed just for that tenant, otherwise the role is removed from the user's global roles. """ user_id = base.getid(user) role_id = base.getid(role) if tenant: route = "/tenants/%s/users/%s/roles/OS-KSADM/%s" params = (base.getid(tenant), user_id, role_id) return self._delete(route % params) else: route = "/users/%s/roles/OS-KSADM/%s" return self._delete(route % (user_id, role_id))
def share_ip(self, server, ipgroup, address, configure=True): """ Share an IP address from the given IP group onto a server. :param server: The :class:`Server` (or its ID) to share onto. :param ipgroup: The :class:`IPGroup` that the given address belongs to. :param address: The IP address to share. :param configure: If ``True``, the server will be automatically configured to use this IP. I don't know why you'd want this to be ``False``. """ server = base.getid(server) ipgroup = base.getid(ipgroup) body = {'shareIp': {'sharedIpGroupId': ipgroup, 'configureServer': configure}} self._update("/servers/%s/ips/public/%s" % (server, address), body)
def get(self, flavor): """ Get a specific flavor. :param flavor: The ID of the :class:`Flavor` to get. :rtype: :class:`Flavor` """ return self._get("/flavors/%s" % base.getid(flavor), "flavor")
def get(self, user_id, access): """ Get the access/secret pair for a given access key :rtype: object of type :class:`EC2` """ return self._get( "/users/%s/credentials/OS-EC2/%s" % (user_id, base.getid(access)), "credential")
def get(self, server): """ Get a server. :param server: ID of the :class:`Server` to get. :rtype: :class:`Server` """ return self._get("/servers/%s" % base.getid(server), "server")
def get(self, image): """ Get an image. :param image: The ID of the image to get. :rtype: :class:`Image` """ return self._get("/images/%s" % base.getid(image), "image")
def unshare_ip(self, server, address): """ Stop sharing the given address. :param server: The :class:`Server` (or its ID) to share onto. :param address: The IP address to stop sharing. """ server = base.getid(server) self._delete("/servers/%s/ips/public/%s" % (server, address))
def delete(self, image): """ Delete an image. It should go without saying that you can't delete an image that you didn't create. :param image: The :class:`Image` (or its ID) to delete. """ self._delete("/images/%s" % base.getid(image))
def update_name(self, server, name=None): """ Update the name for a server. :param server: The :class:`Server` (or its ID) to update. :param name: The new server name """ if name is None: return body = {"server": {}} if name: body["server"]["name"] = name self._update("/servers/%s" % base.getid(server), body)
def create(self, name, image, flavor, ipgroup=None, meta=None, files=None): """ Create (boot) a new server. :param name: Something to name the server. :param image: The :class:`Image` to boot with. :param flavor: The :class:`Flavor` to boot onto. :param ipgroup: An initial :class:`IPGroup` for this server. :param meta: A dict of arbitrary key/value metadata to store for this server. A maximum of five entries is allowed, and both keys and values must be 255 characters or less. :param files: A dict of files to overrwrite on the server upon boot. Keys are file names (i.e. ``/etc/passwd``) and values are the file contents (either as a string or as a file-like object). A maximum of five entries is allowed, and each file must be 10k or less. """ body = {"server": { "name": name, "imageRef": base.get_href(image), "flavorRef": base.get_href(flavor), }} if ipgroup: body["server"]["sharedIpGroupId"] = base.getid(ipgroup) if meta: body["server"]["metadata"] = meta # Files are a slight bit tricky. They're passed in a "personality" # list to the POST. Each item is a dict giving a file name and the # base64-encoded contents of the file. We want to allow passing # either an open file *or* some contents as files here. if files: personality = body['server']['personality'] = [] for filepath, file_or_string in files.items(): if hasattr(file_or_string, 'read'): data = file_or_string.read() else: data = file_or_string personality.append({ 'path': filepath, 'contents': data.encode('base64'), }) return self._create("/servers", body, "server")
def delete(self, user): """ Delete a user. """ return self._delete("/users/%s" % base.getid(user))
def list_roles(self, tenant=None): return self.manager.list_roles(self.id, base.getid(tenant))
def get(self, user): return self._get("/users/%s" % base.getid(user), "user")
def get(self, result): return self._get("/benchmark-result/%s/?format=json" % \ base.getid(result))
def delete(self, role): """ Delete a role. """ return self._delete("/OS-KSADM/roles/%s" % base.getid(role))
def remove_user(self, user, role): return self.manager.api.roles.remove_user_role(base.getid(user), base.getid(role), self.id)
def add_user(self, tenant, user, role): """ Add a user to a tenant with the given role. """ return self.api.roles.add_user_role(base.getid(user), base.getid(role), base.getid(tenant))
def delete(self, tenant): """ Delete a tenant. """ return self._delete("/tenants/%s" % (base.getid(tenant)))
def _action(self, action, server, info=None): """ Perform a server "action" -- reboot/rebuild/resize/etc. """ self.api.client.post('/servers/%s/action' % base.getid(server), body={action: info})
def delete(self, server): """ Delete (i.e. shut down and delete the image) this server. """ self._delete("/servers/%s" % base.getid(server))
def delete(self, token): return self._delete("/tokens/%s" % base.getid(token))
def list_users(self, tenant): """ List users for a tenant. """ return self.api.users.list(base.getid(tenant))
def endpoints(self, token): return self._get("/tokens/%s/endpoints" % base.getid(token), "token")
def remove_user(self, tenant, user, role): """ Remove the specified role from the user on the tenant. """ return self.api.roles.remove_user_role(base.getid(user), base.getid(role), base.getid(tenant))
def list_roles(self, user, tenant=None): return self.api.roles.roles_for_user(base.getid(user), base.getid(tenant))
def get(self, role): return self._get("/OS-KSADM/roles/%s" % base.getid(role), "role")
def get(self, result): return self._get("/result/%s/?format=json" % base.getid(result))
def delete(self, user_id, access): """ Delete an access/secret pair for a user """ return self._delete("/users/%s/credentials/OS-EC2/%s" % (user_id, base.getid(access)))