Packages

This package implements the full CloudAPI for managing Joyent Triton clusters

Current section

Files

Jump to
cloudapi lib cloudapi.ex
Raw

lib/cloudapi.ex

defmodule CloudAPI do
@moduledoc """
This module is responsible for tying all CloudAPI related functionality together into one context.
"""
alias CloudAPI.Client
# Account
@doc """
Retrieves your account details.
## Parameters
- login: String that represents the Cloud Portal Login. Defaults to "my".
"""
@spec get_account(String.t()) :: Tuple.t()
def get_account(login \\ "my") do
Client.response_as Client.get("/" <> login), as: %CloudAPI.Account{}
end
@doc """
Updates your account details.
## Parameters
- login: String that represents the Cloud Portal Login. Defaults to "my".
- account: %CloudAPI.Account{} with the details you want updated.
"""
@spec update_account(String.t(), CloudAPI.Account.t()) :: Tuple.t()
def update_account(login \\ "my", account = %CloudAPI.Account{}) do
body = Poison.encode! account
url = "/" <> login
Client.response_as Client.post(url, body), as: %CloudAPI.Config{}
end
# Keys
def list_keys(login \\ "my") do
url = "/" <> login <> "/keys"
Client.response_as Client.get(url), as: [%CloudAPI.Key{}]
end
def get_key(login \\ "my", name_or_fingerprint) do
url = "/" <> login <> "/keys/" <> name_or_fingerprint
Client.response_as Client.get(url), as: %CloudAPI.Key{}
end
def create_key(login \\ "my", key = %CloudAPI.Key{}) do
url = "/" <> login <> "/keys"
body = Poison.encode! key
Client.response_as Client.post(url, body), as: %CloudAPI.Key{}
end
def delete_key(login \\ "my", name_or_fingerprint) do
url = "/" <> login <> "/keys/" <> name_or_fingerprint
Client.response_as Client.delete(url)
end
# Users
def list_users(login \\ "my") do
url = "/" <> login <> "/users"
Client.response_as Client.get(url), as: [%CloudAPI.Account{}]
end
def get_user(login \\ "my", id) do
url = "/" <> login <> "/users/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Account{}
end
def create_user(login \\ "my", user = %CloudAPI.Account{}) do
url = "/" <> login <> "/users"
body = Poison.encode! user
Client.response_as Client.post(url, body), as: %CloudAPI.Account{}
end
def update_user(login \\ "my", user = %CloudAPI.Account{}) do
url = "/" <> login <> "/users/" <> user.id
body = Poison.encode! user
Client.response_as Client.post(url, body), as: %CloudAPI.Account{}
end
def change_user_password(login \\ "my", id, password) do
url = "/" <> login <> "/users/" <> id <> "/change_password"
body = Poison.encode! %{
password: password,
password_confirmation: password,
}
Client.response_as Client.post(url, body), as: %CloudAPI.Account{}
end
def delete_user(login \\ "my", id) do
url = "/" <> login <> "/users/" <> id
Client.response_as Client.delete(url)
end
# Roles
def list_roles(login \\ "my") do
url = "/" <> login <> "/roles"
Client.response_as Client.get(url), as: [%CloudAPI.Role{
policies: [%CloudAPI.Role.Policy{}],
members: [%CloudAPI.Role.Member{}]
}]
end
def get_role(login \\ "my", id) do
url = "/" <> login <> "/roles/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Role{
policies: [%CloudAPI.Role.Policy{}],
members: [%CloudAPI.Role.Member{}]
}
end
def create_role(login \\ "my", role = %CloudAPI.Role{}) do
url = "/" <> login <> "/roles"
body = Poison.encode! role
Client.response_as Client.post(url, body), as: %CloudAPI.Role{
policies: [%CloudAPI.Role.Policy{}],
members: [%CloudAPI.Role.Member{}]
}
end
def update_role(login \\ "my", role = %CloudAPI.Role{}) do
url = "/" <> login <> "/roles/" <> role.id
body = Poison.encode! role
Client.response_as Client.post(url, body), as: %CloudAPI.Role{
policies: [%CloudAPI.Role.Policy{}],
members: [%CloudAPI.Role.Member{}]
}
end
def delete_role(login \\ "my", id) do
url = "/" <> login <> "/roles/" <> id
Client.response_as Client.delete(url)
end
# Policy
def list_policies(login \\ "my") do
url = "/" <> login <> "/policies"
Client.response_as Client.get(url), as: [%CloudAPI.Policy{}]
end
def get_policy(login \\ "my", id) do
url = "/" <> login <> "/policies/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Policy{}
end
def create_policy(login \\ "my", policy = %CloudAPI.Policy{}) do
url = "/" <> login <> "/policies"
body = Poison.encode! policy
Client.response_as Client.post(url, body), as: %CloudAPI.Policy{}
end
def update_policy(login \\ "my", policy = %CloudAPI.Policy{}) do
url = "/" <> login <> "/policies/" <> policy.id
body = Poison.encode! policy
Client.response_as Client.post(url, body), as: %CloudAPI.Policy{}
end
def delete_policy(login \\ "my", id) do
url = "/" <> login <> "/policies/" <> id
Client.response_as Client.delete(url)
end
# User SSH user_keys
def list_user_keys(login \\ "my", user) do
url = "/" <> login <> "/users/" <> user <> "/keys"
Client.response_as Client.get(url), as: [%CloudAPI.Key{}]
end
def get_user_key(login \\ "my", user, name_or_fingerprint) do
url = "/" <> login <> "/users/" <> user <> "/keys/" <> name_or_fingerprint
Client.response_as Client.get(url), as: %CloudAPI.Key{}
end
def create_user_key(login \\ "my", user, key = %CloudAPI.Key{}) do
url = "/" <> login <> "/users/" <> user <> "/keys"
body = Poison.encode! key
Client.response_as Client.post(url, body), as: %CloudAPI.Key{}
end
def delete_user_key(login \\ "my", user, name_or_fingerprint) do
url = "/" <> login <> "/users/" <> user <> "/keys/" <> name_or_fingerprint
Client.response_as Client.delete(url)
end
# Config
def get_config(login \\ "my") do
url = "/" <> login <> "/config"
Client.response_as Client.get(url), as: %CloudAPI.Config{}
end
def update_config(login \\ "my", config = %CloudAPI.Config{}) do
body = Poison.encode! config
url = "/" <> login <> "/config"
Client.response_as Client.post(url, body), as: %CloudAPI.Config{}
end
# Datacenters
def list_datacenters() do
Client.response_as Client.get("/my/datacenters")
end
# Services
def list_services() do
Client.response_as Client.get("/my/services")
end
# Images
def list_images(login \\ "my") do
url = "/" <> login <> "/images"
Client.response_as Client.get(url), as: [%CloudAPI.Image{
requirements: %CloudAPI.Image.Requirements{},
files: [%CloudAPI.Image.File{}]
}]
end
def get_image(login \\ "my", id) do
url = "/" <> login <> "/images/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Image{
requirements: %CloudAPI.Image.Requirements{},
files: [%CloudAPI.Image.File{}]
}
end
def delete_image(login \\ "my", id) do
url = "/" <> login <> "/images/" <> id
Client.response_as Client.delete(url)
end
def export_image(login \\ "my", id, manta_path) do
url = "/" <> login <> "/images/" <> id <> "?action=export&manta_path=" <> manta_path
Client.response_as Client.post(url, nil)
end
def create_image_from_machine(login \\ "my", create_image = %CloudAPI.CreateImageFromMachine{}) do
url = "/" <> login <> "/images"
body = Poison.encode! create_image
Client.response_as Client.post(url, body)
end
def import_image_from_datacenter(login \\ "my", datacenter, id) do
url = "/" <> login <> "/images?action=import-from-datacenter&datacenter=" <> datacenter <> "&id=" <> id
Client.response_as Client.post(url, nil), as: %CloudAPI.Image{
requirements: %CloudAPI.Image.Requirements{},
files: [%CloudAPI.Image.File{}]
}
end
def update_image(login \\ "my", image = %CloudAPI.Image{}) do
url = "/" <> login <> "/images/" <> image.id <> "?action=update"
body = Poison.encode! image
Client.response_as Client.post(url, body), as: %CloudAPI.Image{
requirements: %CloudAPI.Image.Requirements{},
files: [%CloudAPI.Image.File{}]
}
end
def clone_image(login \\ "my", id) do
url = "/" <> login <> "/images/" <> id <> "?action=clone"
Client.response_as Client.post(url, nil), as: %CloudAPI.Image{
requirements: %CloudAPI.Image.Requirements{},
files: [%CloudAPI.Image.File{}]
}
end
# Packages
def list_packages(login \\ "my") do
url = "/" <> login <> "/packages"
Client.response_as Client.get(url), as: [%CloudAPI.Package{}]
end
def get_package(login \\ "my", id) do
url = "/" <> login <> "/packages/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Package{}
end
# Machines
def list_machines(login \\ "my") do
url = "/" <> login <> "/machines"
Client.response_as Client.get(url), as: [%CloudAPI.Machine{}]
end
def get_machine(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Machine{}
end
def create_machine(login \\ "my", machine = %CloudAPI.CreateMachine{}) do
url = "/" <> login <> "/machines"
body = Poison.encode! machine
Client.response_as Client.post(url, body), as: %CloudAPI.Machine{}
end
def delete_machine(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id
Client.response_as Client.delete(url)
end
def stop_machine(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "?action=stop"
Client.response_as Client.post(url, nil)
end
def start_machine(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "?action=start"
Client.response_as Client.post(url, nil)
end
def reboot_machine(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "?action=reboot"
Client.response_as Client.post(url, nil)
end
def resize_machine(login \\ "my", id, package_id) do
url = "/" <> login <> "/machines/" <> id <> "?action=resize"
body = Poison.encode! %{
action: "resize",
package: package_id
}
Client.response_as Client.post(url, body)
end
def rename_machine(login \\ "my", id, name) do
url = "/" <> login <> "/machines/" <> id <> "?action=resize"
body = Poison.encode! %{
action: "resize",
name: name
}
Client.response_as Client.post(url, body)
end
def enable_machine_firewall(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "?action=enable_firewall"
Client.response_as Client.post(url, nil)
end
def disable_machine_firewall(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "?action=disable_firewall"
Client.response_as Client.post(url, nil)
end
def enable_machine_deletion_protection(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "?action=enable_deletion_protection"
Client.response_as Client.post(url, nil)
end
def disable_machine_deletion_protection(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "?action=disable_deletion_protection"
Client.response_as Client.post(url, nil)
end
def create_machine_snapshot(login \\ "my", id, name) do
url = "/" <> login <> "/machines/" <> id <> "/snapshots"
body = Poison.encode! %{
name: name
}
Client.response_as Client.post(url, body)
end
def start_machine_from_snapshot(login \\ "my", id, name) do
url = "/" <> login <> "/machines/" <> id <> "/snapshots/" <> name
Client.response_as Client.post(url, nil)
end
def list_machine_snapshots(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "/snapshots"
Client.response_as Client.get(url), as: [%CloudAPI.Machine.Snapshot{}]
end
def get_machine_snapshot(login \\ "my", id, name) do
url = "/" <> login <> "/machines/" <> id <> "/snapshots/" <> name
Client.response_as Client.get(url), as: %CloudAPI.Machine{}
end
def delete_machine_snapshot(login \\ "my", id, name) do
url = "/" <> login <> "/machines/" <> id <> "/snapshots/" <> name
Client.response_as Client.delete(url)
end
# TODO CreateMachineDisk (bhyve)
# TODO ResizeMachineDisk (bhyve)
# TODO GetMachineDisk (bhyve)
# TODO ListMachineDisks (bhyve)
# TODO DeleteMachineDisk (bhyve)
def update_machine_metadata(login \\ "my", id, metadata = %{}) do
url = "/" <> login <> "/machines/" <> id <> "/metadata"
body = Poison.encode! metadata
Client.response_as Client.post(url, body)
end
def list_machine_metadata(login \\ "my", id, credentials \\ false) when is_boolean(credentials) do
url = "/" <> login <> "/machines/" <> id <> "/metadata?credentials=" <> credentials
Client.response_as Client.get(url, nil)
end
def get_machine_metadata(login \\ "my", id, key) do
url = "/" <> login <> "/machines/" <> id <> "/metadata/" <> key
Client.response_as Client.get(url, nil)
end
def delete_machine_metadata(login \\ "my", id, key) do
url = "/" <> login <> "/machines/" <> id <> "/metadata/" <> key
Client.response_as Client.delete(url, nil)
end
def delete_all_machine_metadata(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "/metadata"
Client.response_as Client.delete(url, nil)
end
def add_machine_tags(login \\ "my", id, tags = %{}) do
url = "/" <> login <> "/machines/" <> id <> "/tags"
body = Poison.encode! tags
Client.response_as Client.post(url, body)
end
def replace_machine_tags(login \\ "my", id, tags = %{}) do
url = "/" <> login <> "/machines/" <> id <> "/tags"
body = Poison.encode! tags
Client.response_as Client.put(url, body)
end
def list_machine_tags(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "/tags"
Client.response_as Client.get(url, nil)
end
def get_machine_tags(login \\ "my", id, key) do
url = "/" <> login <> "/machines/" <> id <> "/tags/" <> key
Client.response_as Client.get(url, nil)
end
def delete_machine_tag(login \\ "my", id, key) do
url = "/" <> login <> "/machines/" <> id <> "/tags/" <> key
Client.response_as Client.delete(url, nil)
end
def delete_all_machine_tags(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "/tags"
Client.response_as Client.delete(url, nil)
end
def machine_audit(login \\ "my", id) do
url = "/" <> login <> "/machines/" <> id <> "/audit"
Client.response_as Client.get(url, nil)
end
# Migrations
def list_migrations(login \\ "my") do
url = "/" <> login <> "/migrations"
Client.response_as Client.get(url), as: [%CloudAPI.Migration{}]
end
def get_migration(login \\ "my", id) do
url = "/" <> login <> "/migrations/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Migration{}
end
def migrate(login \\ "my", id, action, affinity \\ []) do
url = "/" <> login <> "/machines/" <> id <> "/migrate"
body = Poison.encode! %{
action: action,
affinity: affinity
}
Client.response_as Client.post(url, body), as: %CloudAPI.Migration{}
end
# Firewall Rules
def list_firewall_rules(login \\ "my") do
url = "/" <> login <> "/fwrules"
Client.response_as Client.get(url), as: [%CloudAPI.FirewallRule{}]
end
def get_firewall_rule(login \\ "my", id) do
url = "/" <> login <> "/fwrules/" <> id
Client.response_as Client.get(url), as: %CloudAPI.FirewallRule{}
end
def create_firewall_rule(login \\ "my", fwrule = %CloudAPI.FirewallRule{}) do
url = "/" <> login <> "/fwrules"
body = Poison.encode! fwrule
Client.response_as Client.post(url, body), as: %CloudAPI.FirewallRule{}
end
def update_firewall_rule(login \\ "my", fwrule = %CloudAPI.FirewallRule{}) do
url = "/" <> login <> "/fwrules/" <> fwrule.id
body = Poison.encode! fwrule
Client.response_as Client.post(url, body), as: %CloudAPI.FirewallRule{}
end
def enable_firewall_rule(login \\ "my", id) do
url = "/" <> login <> "/fwrules/" <> id <> "/enable"
Client.response_as Client.post(url, nil)
end
def disable_firewall_rule(login \\ "my", id) do
url = "/" <> login <> "/fwrules/" <> id <> "/disable"
Client.response_as Client.post(url, nil)
end
def delete_firewall_rule(login \\ "my", id) do
url = "/" <> login <> "/fwrules/" <> id
Client.response_as Client.delete(url)
end
def list_machine_firewall_rules(login \\ "my", machine_id) do
url = "/" <> login <> "/machines/" <> machine_id <> "/fwrules"
Client.response_as Client.get(url), as: [%CloudAPI.FirewallRule{}]
end
def list_firewall_rules_machines(login \\ "my", rule_id) do
url = "/" <> login <> "/fwrules/" <> rule_id <> "/machines"
Client.response_as Client.get(url), as: [%CloudAPI.Machine{}]
end
# Fabrics
def list_fabric_vlans(login \\ "my") do
url = "/" <> login <> "/fabrics/default/vlans"
Client.response_as Client.get(url), as: [%CloudAPI.VLAN{}]
end
def get_fabric_vlan(login \\ "my", id) do
url = "/" <> login <> "/fabrics/default/vlan/" <> id
Client.response_as Client.get(url), as: %CloudAPI.VLAN{}
end
def create_fabric_vlan(login \\ "my", vlan = %CloudAPI.VLAN{}) do
url = "/" <> login <> "/fabrics/default/vlan"
body = Poison.encode! vlan
Client.response_as Client.post(url, body), as: %CloudAPI.VLAN{}
end
def update_fabric_vlan(login \\ "my", vlan = %CloudAPI.VLAN{}) do
url = "/" <> login <> "/fabrics/default/vlan/" <> vlan.id
body = Poison.encode! vlan
Client.response_as Client.post(url, body), as: %CloudAPI.VLAN{}
end
def delete_fabric_vlan(login \\ "my", id) do
url = "/" <> login <> "/fabrics/default/vlans/" <> id
Client.response_as Client.delete(url)
end
def list_fabric_networks(login \\ "my", vlan_id) do
url = "/" <> login <> "/fabrics/default/vlans/" <> vlan_id <> "/networks"
Client.response_as Client.get(url), as: [%CloudAPI.Network{}]
end
def get_fabric_network(login \\ "my", vlan_id, id) do
url = "/" <> login <> "/fabrics/default/vlans/" <> vlan_id <> "/networks/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Network{}
end
def create_fabric_network(login \\ "my", vlan_id, network = %CloudAPI.Network{}) do
url = "/" <> login <> "/fabrics/default/vlans/" <> vlan_id <> "/networks"
body = Poison.encode! network
Client.response_as Client.post(url, body), as: %CloudAPI.Network{}
end
def update_fabric_network(login \\ "my", vlan_id, network = %CloudAPI.Network{}) do
url = "/" <> login <> "/fabrics/default/vlans/" <> vlan_id <> "/networks/" <> network.id
body = Poison.encode! network
Client.response_as Client.post(url, body), as: %CloudAPI.Network{}
end
def delete_fabric_network(login \\ "my", vlan_id, id) do
url = "/" <> login <> "/fabrics/default/vlans/" <> vlan_id <> "/networks/" <> id
Client.response_as Client.delete(url)
end
# Networks
def list_networks(login \\ "my") do
url = "/" <> login <> "/networks"
Client.response_as Client.get(url), as: [%CloudAPI.Network{}]
end
def get_network(login \\ "my", id) do
url = "/" <> login <> "/networks/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Network{}
end
def list_network_ips(login \\ "my", id) do
url = "/" <> login <> "/networks/" <> id <> "/ips"
Client.response_as Client.get(url), as: [%CloudAPI.Network.IP{}]
end
def get_network_ip(login \\ "my", id, ip) do
url = "/" <> login <> "/networks/" <> id <> "/ips/" <> ip
Client.response_as Client.get(url), as: %CloudAPI.Network.IP{}
end
# NICs
def list_nics(login \\ "my", machine_id) do
url = "/" <> login <> "/machines/" <> machine_id <> "/nics"
Client.response_as Client.get(url), as: [%CloudAPI.NIC{}]
end
def get_nic(login \\ "my", machine_id, mac) do
url = "/" <> login <> "/machines/" <> machine_id <> "/nics/" <> mac
Client.response_as Client.get(url), as: %CloudAPI.NIC{}
end
def add_nic(login \\ "my", machine_id, network_id) do
url = "/" <> login <> "/machines/" <> machine_id <> "/nics"
body = Poison.encode! %{
network: network_id
}
Client.response_as Client.post(url, body), as: %CloudAPI.NIC{}
end
def remove_nic(login \\ "my", machine_id, mac) do
url = "/" <> login <> "/machines/" <> machine_id <> "/nics/" <> mac
Client.response_as Client.delete(url)
end
# Volumes
def list_volumes(login \\ "my") do
url = "/" <> login <> "/volumes"
Client.response_as Client.get(url), as: [%CloudAPI.Volume{}]
end
def get_volume(login \\ "my", id) do
url = "/" <> login <> "/volumes/" <> id
Client.response_as Client.get(url), as: %CloudAPI.Volume{}
end
def create_volume(login \\ "my", volume = %CloudAPI.Volume{}) do
url = "/" <> login <> "/volumes"
body = Poison.encode! volume
Client.response_as Client.post(url, body), as: %CloudAPI.Volume{}
end
def update_volume(login \\ "my", volume = %CloudAPI.Volume{}) do
url = "/" <> login <> "/volumes/" <> volume.id
body = Poison.encode! volume
Client.response_as Client.post(url, body), as: %CloudAPI.Volume{}
end
def delete_volume(login \\ "my", id) do
url = "/" <> login <> "/volumes/" <> id
Client.response_as Client.delete(url)
end
end