# frozen_string_literal: true require 'vagrant' require 'fog/profitbricks' module VagrantPlugins module ProfitBricks class Config < Vagrant.plugin('2', :config) # The API key to access ProfitBricks - password # @return [String] attr_accessor :password # The username to access ProfitBricks. # # @return [String] attr_accessor :username # The url to access ProfitBricks Cloud API. # # expected to be a string url - # 'https://api.profitbricks.com/cloudapi/v4/' attr_accessor :profitbricks_url # The flavor of server to launch, either the ID or name. This # can also be a regular expression to partially match a name. attr_accessor :flavor # The name or ID of the image to use. This can also be a regular # expression to partially match a name. attr_accessor :image attr_accessor :image_alias # The name of the server. This defaults to the name of the machine # defined by Vagrant (via `config.vm.define`), but can be overriden # here. attr_accessor :server_name # Id or Name (name can be regular expression ) of datacenter. If provided with Name that doesn't match # new datacenter will be created in location specified by location option attr_accessor :datacenter_id # Specify location for datacenter if one needs to be created, default value is 'us/las' attr_accessor :location # Disk volume size in GB attr_accessor :volume_size # Disk volume type (SSD or HDD) # Will default to HDD if not specified attr_accessor :volume_type # The licence type of the volume. Options: LINUX, WINDOWS, UNKNOWN, OTHER # You will need to provide either the image or the licence_type parameters. # licence_type is required, but if image is supplied, it is already set and cannot be changed attr_accessor :volume_licence_type # The storage availability zone assigned to the volume. # Valid values: AUTO, ZONE_1, ZONE_2, or ZONE_3. This only applies to HDD volumes. # Leave blank or set to AUTO when provisioning SSD volumes. # Will default to AUTO if not specified attr_accessor :volume_availability_zone # One or more SSH keys to allow access to the volume via SSH. # Works with ProfitBricks supplied Linux images. attr_accessor :public_ssh_keys # POne-time password is set on the Image for the appropriate account. # This field may only be set in creation requests. When reading, it always returns null. # Password has to contain 8-50 characters. Only these characters are allowed: [abcdefghjkmnpqrstuvxABCDEFGHJKLMNPQRSTUVX23456789] attr_accessor :image_password # number of cores in profitbricks server attr_accessor :cores # Required, amount of memory in GB allocated to virtual server attr_accessor :ram # Sets the CPU type. "AMD_OPTERON" or "INTEL_XEON". Defaults to "AMD_OPTERON". attr_accessor :cpu_family # The LAN ID the network interface (NIC) will sit on. If the LAN ID does not exist it will be created. attr_accessor :lan_id # Indicates the private IP address has outbound access to the public internet. Defaults to 'false'. attr_accessor :nat def initialize @password = UNSET_VALUE @profitbricks_url = UNSET_VALUE @flavor = UNSET_VALUE @cores = UNSET_VALUE @ram = UNSET_VALUE @image = nil @image_alias = nil @server_name = UNSET_VALUE @datacenter_id = UNSET_VALUE @username = UNSET_VALUE @volume_size = UNSET_VALUE @location = UNSET_VALUE @volume_type = UNSET_VALUE @volume_licence_type = UNSET_VALUE @volume_availability_zone = UNSET_VALUE @public_ssh_keys = UNSET_VALUE @cpu_family = UNSET_VALUE @lan_id = UNSET_VALUE @nat = UNSET_VALUE @image_password = UNSET_VALUE end def finalize! @password = nil if @password == UNSET_VALUE @profitbricks_url = nil if @profitbricks_url == UNSET_VALUE @flavor = nil if @flavor == UNSET_VALUE @cores = 1 if @cores == UNSET_VALUE @ram = 2048 if ram == UNSET_VALUE @server_name = nil if @server_name == UNSET_VALUE @datacenter_id = nil if @datacenter_id == UNSET_VALUE @username = nil if @username == UNSET_VALUE @volume_size = 5 if @volume_size == UNSET_VALUE @location = 'us/las' if @location == UNSET_VALUE @volume_type = 'HDD' if @volume_type == UNSET_VALUE @volume_licence_type = 'UNKNOWN' if @volume_licence_type == UNSET_VALUE @volume_availability_zone = 'AUTO' if @volume_availability_zone == UNSET_VALUE @public_ssh_keys = nil if @public_ssh_keys == UNSET_VALUE @cpu_family = 'AMD_OPTERON' if @cpu_family == UNSET_VALUE @lan_id = nil if @lan_id == UNSET_VALUE @nat = false if @nat == UNSET_VALUE @image_password = nil if @image_password == UNSET_VALUE end def validate(_machine) errors = _detected_errors errors << I18n.t('vagrant_profitbricks.config.password_required') unless @password errors << I18n.t('vagrant_profitbricks.config.username_required') unless @username errors << I18n.t('vagrant_profitbricks.config.datacenter_required') unless @datacenter_id errors << I18n.t('vagrant_profitbricks.config.image_or_image_alias_must_be_provided') if !@image && !@image_alias errors << I18n.t('vagrant_profitbricks.config.image_password_or_public_ssh_required') if !@public_ssh_keys && !@image_password { url: @profitbricks_url }.each_pair do |key, value| errors << I18n.t('vagrant_profitbricks.config.invalid_uri', key: key, uri: value) unless value.nil? || valid_uri?(value) end { 'ProfitBricks Provider' => errors } end private def valid_uri?(value) uri = URI.parse value uri.is_a?(URI::HTTP) end end end end