class Bosh::Cli::Command::Redis

Public Instance Methods

create_redis() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 58
def create_redis
  auth_required

  service_name = options[:name] || default_name
  resource_size = options[:size] || default_size
  persistent_disk = options[:disk] || default_persistent_disk
  security_group = options[:security_group] || default_security_group
  redis_port = 6379

  bosh_status # preload
  nl
  say "CPI: #{bosh_cpi.make_green}"
  say "Deployment name: #{service_name.make_green}"
  say "Resource size: #{validated_resource_size_colored(resource_size)}"
  say "Persistent disk: #{persistent_disk.to_s.make_green}"
  say "Security group: #{security_group.make_green}"
  nl

  step("Validating resource size", "Resource size must be in #{available_resource_sizes.join(', ')}", :non_fatal) do
    available_resource_sizes.include?(resource_size)
  end

  unless confirmed?("Security group exists with ports 22 & #{redis_port}")
    cancel_deployment
  end
  unless confirmed?("Creating redis service")
    cancel_deployment
  end

  raise Bosh::Cli::ValidationHalted unless errors.empty?

  template_file = template_file("single_vm.yml.erb")

  # Create an initial deployment file; upon which the CPI-specific template will be applied below
  # Initial file will look like:
  # ---
  # name: NAME
  # director_uuid: UUID
  # networks: {}
  # properties:
  #   redis:
  #     resource: medium
  #     security_group: redis-server
  deployment_file = "deployments/redis/#{service_name}.yml"
  step("Checking/creating #{redis_deployments_store_path} for deployment files",
       "Failed to create #{redis_deployments_store_path} for deployment files", :fatal) do
    mkdir_p(redis_deployments_store_path)
  end

  step("Creating deployment file #{deployment_file}",
       "Failed to create deployment file #{deployment_file}", :fatal) do
    File.open(deployment_file, "w") do |file|
      file << {
        "name" => service_name,
        "director_uuid" => bosh_uuid,
        "networks" => {},
        "properties" => {
          "redis" => {
            "resource" => resource_size,
            "security_group" => security_group,
            "persistent_disk" => persistent_disk
          }
        }
      }.to_yaml
    end

    stdout = Bosh::Cli::Config.output
    Bosh::Cli::Config.output = nil
    deployment_cmd(non_interactive: true).set_current(deployment_file)
    biff_cmd(non_interactive: true).biff(template_file)
    Bosh::Cli::Config.output = stdout
  end
  # re-set current deployment to show output
  deployment_cmd.set_current(deployment_file)
  deployment_cmd(non_interactive: options[:non_interactive]).perform
rescue Bosh::Cli::ValidationHalted
  errors.each do |error|
    say error.make_red
  end
end
delete_redis() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 148
def delete_redis
  load_bosh_and_validate_current_deployment
  deployment_cmd(non_interactive: options[:non_interactive]).delete(deployment_name)
end
prepare_redis() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 25
def prepare_redis
  within_bosh_release do
    # the releases/index.yml contains all the available release versions in an unordered
    # hash of hashes in YAML format:
    #     ---
    #     builds:
    #       af61f03c5ad6327e0795402f1c458f2fc6f21201:
    #         version: 3
    #       39c029d0af9effc6913f3333434b894ff6433638:
    #         version: 1
    #       5f5d0a7fb577fec3c09408c94f7abbe2d52a042c:
    #         version: 4
    #       f044d47e0183f084db9dac5a6ef00d7bd21c8451:
    #         version: 2
    release_index = YAML.load_file("releases/index.yml")
    latest_version = release_index["builds"].values.inject(0) do |max_version, release|
      version = release["version"]
      max_version < version ? version : max_version
    end

    sh "bosh upload release releases/*-#{latest_version}.yml"
  end
end
redis_help() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 14
def redis_help
  say("bosh redis sub-commands:")
  nl
  cmds = Bosh::Cli::Config.commands.values.find_all {|c|
    c.usage =~ /redis/
  }
  Bosh::Cli::Command::Help.list_commands(cmds)
end
show_redis_uri() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 141
def show_redis_uri
  load_bosh_and_validate_current_deployment
  print service_uri
end

Protected Instance Methods

available_resource_sizes() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 200
def available_resource_sizes
  resources = bosh_release_spec["resources"]
  if resources && resources.is_a?(Array) && resources.first.is_a?(String)
    resources
  else
    err "template spec needs 'resources' key with list of resource pool names available"
  end
end
biff_cmd(options = {}) click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 246
def biff_cmd(options = {})
  cmd = Bosh::Cli::Command::Biff.new
  options.each do |key, value|
    cmd.add_option key.to_sym, value
  end
  cmd
end
bosh_cpi() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 229
def bosh_cpi
  bosh_status["cpi"]
end
bosh_director_client() click to toggle source

TODO this is now a bosh cli command itself; use director

# File lib/bosh/cli/commands/redis.rb, line 234
def bosh_director_client
  director
end
bosh_release_dir() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 179
def bosh_release_dir
  File.expand_path("../../../../../bosh_release", __FILE__)
end
bosh_release_spec() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 191
def bosh_release_spec
  @bosh_release_spec ||= begin
    unless File.exists?(template_file("spec"))
      err "Bosh release templates missing 'spec'"
    end
    YAML.load_file(template_file("spec"))
  end
end
bosh_status() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 216
def bosh_status
  @bosh_status ||= begin
    step("Fetching bosh information", "Cannot fetch bosh information", :fatal) do
       @bosh_status = bosh_director_client.get_status
    end
    @bosh_status
  end
end
bosh_uuid() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 225
def bosh_uuid
  bosh_status["uuid"]
end
default_name() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 155
def default_name
  "redis-#{Time.now.to_i}"
end
default_persistent_disk() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 163
def default_persistent_disk
  4096
end
default_security_group() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 167
def default_security_group
  "default"
end
default_size() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 159
def default_size
  "small"
end
deployment_cmd(options = {}) click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 238
def deployment_cmd(options = {})
  cmd = Bosh::Cli::Command::Deployment.new
  options.each do |key, value|
    cmd.add_option key.to_sym, value
  end
  cmd
end
deployment_file() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 254
def deployment_file
  deployment
end
deployment_name() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 270
def deployment_name
  @deployment["name"]
end
load_bosh_and_validate_current_deployment() click to toggle source

TODO use bosh cli helpers to validate/require this

# File lib/bosh/cli/commands/redis.rb, line 259
def load_bosh_and_validate_current_deployment
  auth_required
  unless File.exists?(deployment_file)
    err "Target deployment file no longer exists: #{deployment_file}"
  end
  @deployment = YAML.load_file(deployment_file)
  unless @deployment["release"] && @deployment["release"]["name"] == release_name
    err "Target deployment file is not for redis service: #{deployment_file}"
  end
end
redis_deployments_store_path() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 175
def redis_deployments_store_path
  "deployments/redis"
end
release_name() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 171
def release_name
  "redis"
end
server_host() click to toggle source

returns the first DNS entry for the running instance

# File lib/bosh/cli/commands/redis.rb, line 282
def server_host
  @server_host ||= begin
    vms = bosh_director_client.fetch_vm_state(deployment_name, use_cache: false)
    if vms.empty?
      err "Deployment has no running instances"
    end
    if vms.size > 1
      say "#{"WARNING!".make_red} Deployment has more than 1 running instance (#{vms.size}); using first instance"
    end
    vm = vms.first
    # bug in bosh dns means old dns entries might still point to this new VM
    vm["dns"].select { |dns| dns =~ %r{#{deployment_name}}  }.first
  end
end
service_uri() click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 274
def service_uri
  password = @deployment["properties"]["redis"]["password"]
  port = @deployment["properties"]["redis"]["port"]
  db = 0
  "redis://:#{password}@#{server_host}:#{port}/#{db}"
end
template_file(file) click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 187
def template_file(file)
  File.join(bosh_release_dir, "templates", bosh_cpi, file)
end
validated_resource_size_colored(resource_size) click to toggle source

If resource_size is within available_resource_sizes then display it in green; else display it in red.

# File lib/bosh/cli/commands/redis.rb, line 211
def validated_resource_size_colored(resource_size)
  available_resource_sizes.include?(resource_size) ?
    resource_size.make_green : resource_size.make_red
end
within_bosh_release(&block) click to toggle source
# File lib/bosh/cli/commands/redis.rb, line 183
def within_bosh_release(&block)
  chdir(bosh_release_dir, &block)
end