lib/vultr.rb in vultr-0.4.3 vs lib/vultr.rb in vultr-1.0.0

- old
+ new

@@ -1,888 +1,57 @@ -require 'faraday' -require 'faraday_middleware' -require 'vultr/version' +require "faraday" +require "faraday_middleware" +require "vultr/version" -module Vultr extend self +module Vultr + autoload :Client, "vultr/client" + autoload :Collection, "vultr/collection" + autoload :Error, "vultr/error" + autoload :Resource, "vultr/resource" + autoload :Object, "vultr/object" - DEFINITIONS = { - # Account - Account: { - info: { - :method => :get, - :path => '/v1/account/info', - :apikey_required => true - } - }, - # Application - App: { - list: { - :method => :get, - :path => '/v1/app/list', - :apikey_required => false - } - }, - # API Key - Auth: { - info: { - :method => :get, - :path => '/v1/auth/info', - :apikey_required => true - } - }, - # Backup - Backup: { - list: { - :method => :get, - :path => '/v1/backup/list', - :params => %w(SUBID BACKUPID), - :apikey_required => true - } - }, - # Bare Metal - BareMetal: { - app_change: { - :method => :post, - :path => '/v1/baremetal/app_change', - :params => %w(SUBID APPID), - :apikey_required => true - }, - app_change_list: { - :method => :get, - :path => '/v1/baremetal/app_change_list', - :params => %w(SUBID), - :apikey_required => true - }, - bandwidth: { - :method => :get, - :path => '/v1/baremetal/bandwidth', - :apikey_required => true - }, - create: { - :method => :post, - :path => '/v1/baremetal/create', - :params => %w(DCID METALPLANID OSID SCRIPTID SNAPSHOTID enable_ipv6 label SSHKEYID APPID userdata notify_activate hostname tag), - :apikey_required => true - }, - destroy: { - :method => :post, - :path => '/v1/baremetal/destroy', - :params => %w(SUBID), - :apikey_required => true - }, - get_app_info: { - :method => :get, - :path => '/v1/baremetal/get_app_info', - :params => %w(SUBID), - :apikey_required => true - }, - get_user_data: { - :method => :get, - :path => '/v1/baremetal/get_user_data', - :params => %w(SUBID), - :apikey_required => true - }, - halt: { - :method => :post, - :path => '/v1/baremetal/halt', - :params => %w(SUBID), - :apikey_required => true - }, - ipv6_enable: { - :method => :post, - :path => '/v1/baremetal/ipv6_enable', - :params => %w(SUBID), - :apikey_required => true - }, - label_set: { - :method => :post, - :path => '/v1/baremetal/label_set', - :params => %w(SUBID label), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/baremetal/list', - :params => %w(SUBID tag label main_ip), - :apikey_required => true - }, - list_ipv4: { - :method => :get, - :path => '/v1/baremetal/list_ipv4', - :params => %w(SUBID), - :apikey_required => true - }, - list_ipv6: { - :method => :get, - :path => '/v1/baremetal/list_ipv6', - :params => %w(SUBID), - :apikey_required => true - }, - os_change: { - :method => :post, - :path => '/v1/baremetal/os_change', - :params => %w(SUBID OSID), - :apikey_required => true - }, - os_change_list: { - :method => :get, - :path => '/v1/baremetal/os_change_list', - :params => %w(SUBID), - :apikey_required => true - }, - reboot: { - :method => :post, - :path => '/v1/baremetal/reboot', - :params => %w(SUBID), - :apikey_required => true - }, - reinstall: { - :method => :post, - :path => '/v1/baremetal/reinstall', - :params => %w(SUBID), - :apikey_required => true - }, - set_user_data: { - :method => :post, - :path => '/v1/baremetal/set_user_data', - :params => %w(SUBID userdata), - :apikey_required => true - }, - tag_set: { - :method => :post, - :path => '/v1/baremetal/tag_set', - :params => %w(SUBID tag), - :apikey_required => true - } - }, - # Block Storage - Block: { - attach: { - :method => :post, - :path => '/v1/block/attach?api_key=[api_key]', - :params => %w(SUBID attach_to_SUBID), - :apikey_required => true - }, - create: { - :method => :post, - :path => '/v1/block/create', - :params => %w(DCID size_gb label), - :apikey_required => true - }, - delete: { - :method => :post, - :path => '/v1/block/delete', - :params => %w(SUBID), - :apikey_required => true - }, - detach: { - :method => :post, - :path => '/v1/block/detach', - :params => %w(SUBID), - :apikey_required => true - }, - label_set: { - :method => :post, - :path => '/v1/block/label_set', - :params => %w(SUBID label), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/block/list', - :params => %w(SUBID), - :apikey_required => true - }, - resize: { - :method => :post, - :path => '/v1/block/resize', - :params => %w(SUBID size_gb), - :apikey_required => true - } - }, - # DNS - DNS: { - create_domain: { - :method => :post, - :path => '/v1/dns/create_domain', - :params => %w(domain serverip), - :apikey_required => true - }, - create_record: { - :method => :post, - :path => '/v1/dns/create_record', - :params => %w(domain name type data ttl priority), - :apikey_required => true - }, - delete_domain: { - :method => :post, - :path => '/v1/dns/delete_domain', - :params => %w(domain), - :apikey_required => true - }, - delete_record: { - :method => :post, - :path => '/v1/dns/delete_record', - :params => %w(domain RECORDID), - :apikey_required => true - }, - dnssec_enable: { - :method => :post, - :path => '/v1/dns/dnssec_enable', - :params => %w(domain enable), - :apikey_required => true - }, - dnssec_info: { - :method => :post, - :path => '/v1/dns/dnssec_info', - :params => %w(domain), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/dns/list', - :apikey_required => true - }, - records: { - :method => :get, - :path => '/v1/dns/records', - :params => %w(domain), - :apikey_required => true - }, - soa_info: { - :method => :get, - :path => '/v1/dns/records', - :params => %w(domain), - :apikey_required => true - }, - soa_update: { - :method => :get, - :path => '/v1/dns/records', - :params => %w(domain), - :apikey_required => true - }, - update_record: { - :method => :post, - :path => '/v1/dns/update_record', - :params => %w(domain RECORDID name type data ttl priority), - :apikey_required => true - } - }, - # Firewall - Firewall: { - group_create: { - :method => :post, - :path => '/v1/firewall/group_create', - :params => %w(description), - :apikey_required => true - }, - group_delete: { - :method => :post, - :path => '/v1/firewall/group_delete', - :params => %w(FIREWALLGROUPID), - :apikey_required => true - }, - group_list: { - :method => :get, - :path => '/v1/firewall/group_list', - :params => %w(FIREWALLGROUPID), - :apikey_required => true - }, - group_set_description: { - :method => :post, - :path => '/v1/firewall/group_set_description', - :params => %w(FIREWALLGROUPID description), - :apikey_required => true - }, - rule_create: { - :method => :post, - :path => '/v1/firewall/rule_create', - :params => %w(FIREWALLGROUPID direction ip_type protocol subnet subnet_size port notes), - :apikey_required => true - }, - rule_delete: { - :method => :post, - :path => '/v1/firewall/rule_delete', - :params => %w(FIREWALLGROUPID rulenumber), - :apikey_required => true - }, - rule_list: { - :method => :get, - :path => '/v1/firewall/rule_list', - :params => %w(FIREWALLGROUPID direction ip_type), - :apikey_required => true - } - }, - # ISO Image - ISO: { - create_from_url: { - :method => :post, - :path => '/v1/iso/create_from_url', - :params => %w(url), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/iso/list', - :apikey_required => true - }, - list_public: { - :method => :get, - :path => '/v1/iso/list_public', - :apikey_required => true - } - }, - # Network - Network: { - create: { - :method => :post, - :path => '/v1/network/create', - :params => %w(DCID description v4_subnet v4_subnet_mask), - :apikey_required => true - }, - destroy: { - :method => :post, - :path => '/v1/network/destroy', - :params => %w(NETWORKID), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/network/list', - :apikey_required => true - } - }, - # Operating System - OS: { - list: { - :method => :get, - :path => '/v1/os/list', - :apikey_required => false - } - }, - # Plans - Plans: { - list: { - :method => :get, - :path => '/v1/plans/list', - :params => %w(type), - :apikey_required => true - }, - list_baremetal: { - :method => :get, - :path => '/v1/plans/list_baremetal', - :apikey_required => true - }, - list_vc2: { - :method => :get, - :path => '/v1/plans/list_vc2', - :apikey_required => false - }, - list_vdc2: { - :method => :get, - :path => '/v1/plans/list_vdc2', - :apikey_required => false - } - }, - # Regions - Regions: { - availability: { - :method => :get, - :path => '/v1/regions/availability', - :params => %w(DCID type), - :apikey_required => false - }, - availability_baremetal: { - :method => :get, - :path => '/v1/regions/availability_baremetal', - :params => %w(DCID), - :apikey_required => true - }, - availability_vc2: { - :method => :get, - :path => '/v1/regions/availability_vc2', - :params => %w(DCID), - :apikey_required => false - }, - availability_vdc2: { - :method => :get, - :path => '/v1/regions/availability_vdc2', - :params => %w(DCID), - :apikey_required => false - }, - list: { - :method => :get, - :path => '/v1/regions/list', - :params => %w(availability), - :apikey_required => false - } - }, - # Reserved IP - ReservedIP: { - attach: { - :method => :post, - :path => '/v1/reservedip/attach', - :params => %w(ip_address attach_SUBID), - :apikey_required => true - }, - convert: { - :method => :post, - :path => '/v1/reservedip/convert', - :params => %w(SUBID ip_address label), - :apikey_required => true - }, - create: { - :method => :post, - :path => '/v1/reservedip/create', - :params => %w(DCID ip_type label), - :apikey_required => true - }, - destroy: { - :method => :post, - :path => '/v1/reservedip/destroy', - :params => %w(ip_address), - :apikey_required => true - }, - detach: { - :method => :post, - :path => '/v1/reservedip/detach', - :params => %w(ip_address detach_SUBID), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/reservedip/list', - :apikey_required => true - } - }, - # Server - Server: { - app_change: { - :method => :post, - :path => '/v1/server/app_change', - :params => %w(SUBID APPID), - :apikey_required => true - }, - app_change_list: { - :method => :get, - :path => '/v1/server/app_change_list', - :params => ['SUBID'], - :apikey_required => true - }, - backup_disable: { - :method => :post, - :path => '/v1/server/backup_disable', - :params => %w(SUBID), - :apikey_required => true - }, - backup_enable: { - :method => :post, - :path => '/v1/server/backup_enable', - :params => %w(SUBID), - :apikey_required => true - }, - backup_get_schedule: { - :method => :post, - :path => '/v1/server/backup_get_schedule', - :params => %w(SUBID), - :apikey_required => true - }, - backup_set_schedule: { - :method => :post, - :path => '/v1/server/backup_set_schedule', - :params => %w(SUBID cron_type hour dow dom), - :apikey_required => true - }, - bandwidth: { - :method => :get, - :path => '/v1/server/bandwidth', - :params => %w(SUBID), - :apikey_required => true - }, - create: { - :method => :post, - :path => '/v1/server/create', - :params => %w(DCID VPSPLANID OSID ipxe_chain_url ISOID SCRIPTID SNAPSHOTID enable_ipv6 enable_private_network NETWORKID label SSHKEYID auto_backups APPID userdata notify_activate ddos_protection reserved_ip_v4 hostname tag FIREWALLGROUPID), - :apikey_required => true - }, - create_ipv4: { - :method => :post, - :path => '/v1/server/create_ipv4', - :params => %w(SUBID reboot), - :apikey_required => true - }, - destroy: { - :method => :post, - :path => '/v1/server/destroy', - :params => %w(SUBID), - :apikey_required => true - }, - destroy_ipv4: { - :method => :post, - :path => '/v1/server/destroy_ipv4', - :params => %w(SUBID ip), - :apikey_required => true - }, - firewall_group_set: { - :method => :post, - :path => '/v1/server/firewall_group_set', - :params => %w(SUBID FIREWALLGROUPID), - :apikey_required => true - }, - get_app_info: { - :method => :get, - :path => '/v1/server/get_app_info', - :params => %w(SUBID), - :apikey_required => true - }, - get_user_data: { - :method => :get, - :path => '/v1/server/set_user_data', - :params => %w(SUBID), - :apikey_required => true - }, - halt: { - :method => :post, - :path => '/v1/server/halt', - :params => %w('SUBID'), - :apikey_required => true - }, - ipv6_enable: { - :method => :post, - :path => '/v1/server/ipv6_enable', - :params => %w(SUBID), - :apikey_required => true - }, - iso_attach: { - :method => :post, - :path => '/v1/server/iso_detach', - :params => %w(SUBID, ISOID), - :apikey_required => true - }, - iso_detach: { - :method => :post, - :path => '/v1/server/iso_detach', - :params => %w(SUBID), - :apikey_required => true - }, - iso_status: { - :method => :get, - :path => '/v1/server/iso_status', - :params => %w(SUBID), - :apikey_required => true - }, - label_set: { - :method => :post, - :path => '/v1/server/label_set', - :params => %w(SUBID label), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/server/list', - :params => %w(SUBID tag label main_ip), - :apikey_required => true - }, - list_ipv4: { - :method => :get, - :path => '/v1/server/list_ipv4', - :params => %w(SUBID), - :apikey_required => true - }, - list_ipv6: { - :method => :get, - :path => '/v1/server/list_ipv6', - :params => %w(SUBID), - :apikey_required => true - }, - neighbors: { - :method => :get, - :path => '/v1/server/neighbors', - :params => %w(SUBID), - :apikey_required => true - }, - os_change: { - :method => :post, - :path => '/v1/server/os_change', - :params => %w(SUBID OSID), - :apikey_required => true - }, - os_change_list: { - :method => :get, - :path => '/v1/server/os_change_list', - :params => %w(SUBID), - :apikey_required => true - }, - private_network_disable: { - :method => :post, - :path => '/v1/server/private_network_disable', - :params => %w(SUBID NETWORKID), - :apikey_required => true - }, - private_network_enable: { - :method => :post, - :path => '/v1/server/private_network_enable', - :params => %w(SUBID NETWORKID), - :apikey_required => true - }, - private_networks: { - :method => :get, - :path => '/v1/server/private_networks', - :params => %w(SUBID), - :apikey_required => true - }, - reboot: { - :method => :post, - :path => '/v1/server/reboot' 'SUBID', - :params => %w(SUBID), - :apikey_required => true - }, - reinstall: { - :method => :post, - :path => '/v1/server/reinstall', - :params => %w(SUBID hostname), - :apikey_required => true - }, - restore_backup: { - :method => :post, - :path => '/v1/server/restore_backup', - :params => %w(SUBID BACKUPID), - :apikey_required => true - }, - restore_snapshot: { - :method => :post, - :path => '/v1/server/restore_snapshot', - :params => %w(SUBID SNAPSHOTID), - :apikey_required => true - }, - reverse_default_ipv4: { - :method => :post, - :path => '/v1/server/reverse_default_ipv4', - :params => %w(SUBID ip), - :apikey_required => true - }, - reverse_delete_ipv6: { - :method => :post, - :path => '/v1/server/reverse_delete_ipv6', - :params => %w(SUBID ip), - :apikey_required => true - }, - reverse_list_ipv6: { - :method => :get, - :path => '/v1/server/reverse_list_ipv6', - :params => %w(SUBID), - :apikey_required => true - }, - reverse_set_ipv4: { - :method => :post, - :path => '/v1/server/reverse_set_ipv4', - :params => %w(SUBID ip entry), - :apikey_required => true - }, - reverse_set_ipv6: { - :method => :post, - :path => '/v1/server/reverse_set_ipv6', - :params => %w(SUBID ip entry), - :apikey_required => true - }, - set_user_data: { - :method => :post, - :path => '/v1/server/set_user_data', - :params => %w(SUBID userdata), - :apikey_required => true - }, - start: { - :method => :post, - :path => '/v1/server/start', - :params => %w(SUBID), - :apikey_required => true - }, - tag_set: { - :method => :post, - :path => '/v1/server/tag_set', - :params => %w(SUBID tag), - :apikey_required => true - }, - upgrade_plan: { - :method => :post, - :path => '/v1/server/upgrade_plan', - :params => %w(SUBID VPSPLANID), - :apikey_required => true - }, - upgrade_plan_list: { - :method => :get, - :path => '/v1/server/upgrade_plan_list', - :params => %w(SUBID), - :apikey_required => true - } - }, - # Snapshot - Snapshot: { - create: { - :method => :post, - :path => '/v1/snapshot/create', - :params => %w(SUBID), - :apikey_required => true - }, - destroy: { - :method => :post, - :path => '/v1/snapshot/destroy', - :params => %w(SNAPSHOTID), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/snapshot/list', - :apikey_required => true - } - }, - # SSH Key - SSHKey: { - create: { - :method => :post, - :path => '/v1/sshkey/create', - :params => %w(name ssh_key), - :apikey_required => true - }, - destroy: { - :method => :post, - :path => '/v1/sshkey/destroy', - :params => %w(SSHKEYID), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/sshkey/list', - :apikey_required => true - }, - update: { - :method => :post, - :path => '/v1/sshkey/update', - :params => %w(SSHKEYID name ssh_key), - :apikey_required => true - } - }, - # Startup Script - StartupScript: { - create: { - :method => :post, - :path => '/v1/startupscript/create', - :params => %w(name script type), - :apikey_required => true - }, - destroy: { - :method => :post, - :path => '/v1/startupscript/destroy', - :params => %w(SCRIPTID), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/startupscript/list', - :apikey_required => true - }, - update: { - :method => :post, - :path => '/v1/startupscript/update', - :params => %w(SCRIPTID name script), - :apikey_required => true - } - }, - # User Management - User: { - create: { - :method => :post, - :path => '/v1/user/create', - :params => %w(email name password api_enabled acls), - :apikey_required => true - }, - delete: { - :method => :post, - :path => '/v1/user/delete', - :params => %w(USERID), - :apikey_required => true - }, - list: { - :method => :get, - :path => '/v1/user/list', - :apikey_required => true - }, - update: { - :method => :post, - :path => '/v1/user/update', - :params => %w(USERID email name password api_enabled acls), - :apikey_required => true - } - } - } + # High-level categories of Vultr API calls + autoload :AccountResource, "vultr/resources/account" + autoload :ApplicationsResource, "vultr/resources/applications" + autoload :InstancesResource, "vultr/resources/instances" + autoload :BackupsResource, "vultr/resources/backups" + autoload :BareMetalResource, "vultr/resources/bare_metal" + autoload :BlockStorageResource, "vultr/resources/block_storage" + autoload :DnsResource, "vultr/resources/dns" + autoload :FirewallResource, "vultr/resources/firewall" + autoload :IsoResource, "vultr/resources/iso" + autoload :KubernetesResource, "vultr/resources/kubernetes" + autoload :LoadBalancersResource, "vultr/resources/load_balancers" + autoload :ObjectStorageResource, "vultr/resources/object_storage" + autoload :OperatingSystemsResource, "vultr/resources/operating_systems" + autoload :PlansResource, "vultr/resources/plans" + autoload :PrivateNetworksResource, "vultr/resources/private_networks" + autoload :RegionsResource, "vultr/resources/regions" + autoload :ReservedIpsResource, "vultr/resources/reserved_ips" + autoload :SnapshotsResource, "vultr/resources/snapshots" + autoload :SshKeysResource, "vultr/resources/ssh_keys" + autoload :StartupScriptsResource, "vultr/resources/startup_scripts" + autoload :UserResource, "vultr/resources/users" - DEFINITIONS.each do |resource_name, actions| - resource_class = Class.new(Object) do - actions.each do |action, config| - method = config.fetch(:method) - path = config.fetch(:path) - params = config.fetch(:params, nil) - apikey_required = config.fetch(:apikey_required, false) - - define_singleton_method action do |*args| - headers = apikey_required ? {'API-Key' => Vultr::APIKey} : {} - body = nil - if method == :get - extra_params = Hash.new - hash = args[-1] - if hash.is_a?(Hash) - hash.each do |key, value| - extra_params[key] = value if params.include? key.to_s - end - end - url = Vultr.request.build_url(path, extra_params) - elsif method == :post - body = Hash.new - hash = args[-1] - if hash.is_a?(Hash) - hash.each do |key, value| - body[key] = value if params.include? key.to_s - end - end - url = Vultr.request.build_url(path) - end - - resp = Vultr.request.run_request(method, url, body, headers) - {status: resp.status, result: resp.body} - end - end - end - - Vultr.const_set(resource_name, resource_class) - end - - def request=(request) - @request = request - end - - def request - @request - end - - def api_key=(api_key) - Vultr.const_set('APIKey', api_key) - setup_request! - - Vultr::APIKey - end - - def api_key - return Vultr::APIKey if Vultr::APIKey - 'API Key is required' - end - - private - - def setup_request! - Vultr.request = Faraday.new do |faraday| - faraday.url_prefix = 'https://api.vultr.com' - faraday.request :url_encoded - faraday.response :json, :content_type => 'application/json' - faraday.adapter :net_http - end - end + # Classes used to return a nicer object wrapping the response data + autoload :Account, "vultr/objects/account" + autoload :Application, "vultr/objects/application" + autoload :Backup, "vultr/objects/backup" + autoload :BareMetal, "vultr/objects/bare_metal" + autoload :BlockStorage, "vultr/objects/block_storage" + autoload :Domain, "vultr/objects/domain" + autoload :FirewallGroup, "vultr/objects/firewall_group" + autoload :Instance, "vultr/objects/instance" + autoload :Iso, "vultr/objects/iso" + autoload :KubernetesCluster, "vultr/objects/kubernetes_cluster" + autoload :LoadBalancer, "vultr/objects/load_balancer" + autoload :ObjectStorage, "vultr/objects/object_storage" + autoload :OperatingSystem, "vultr/objects/operating_system" + autoload :Plan, "vultr/objects/plan" + autoload :PrivateNetwork, "vultr/objects/private_network" + autoload :Region, "vultr/objects/region" + autoload :ReservedIp, "vultr/objects/reserved_ip" + autoload :Snapshot, "vultr/objects/snapshot" + autoload :SshKey, "vultr/objects/ssh_key" + autoload :StartupScript, "vultr/objects/startup_script" + autoload :User, "vultr/objects/user" end