class RedisCfPlugin::Plugin

Public Instance Methods

bind_redis_env_var() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 99
def bind_redis_env_var
  load_bosh_and_validate_current_deployment
  env_var = input[:env_var]
  app = input[:app]
  invoke :set_env, app: app, name: env_var, value: service_uri, restart: true
end
create_redis() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 45
def create_redis
  require "cli" # bosh_cli's director client library
  service_name = input[:name] || "redis-#{Time.now.to_i}"
  resource_size = input[:size]
  security_group = input[:security_group]

  bosh_uuid = bosh_director_client.get_status["uuid"]
  bosh_cpi = bosh_director_client.get_status["cpi"]

  template_file = File.join(bosh_release_dir, "templates", bosh_cpi, "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"
  sh "mkdir -p deployments/redis"
  line "Creating deployment file #{deployment_file}..."
  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
        }
      }
    }.to_yaml
  end

  sh "bosh deployment #{deployment_file}"
  sh "bosh -n diff #{template_file}"
  sh "bosh -n deploy"
end
delete_redis() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 108
def delete_redis
  load_bosh_and_validate_current_deployment
  sh "bosh delete deployment #{deployment_name}"
end
prepare_redis() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 13
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
show_redis_uri() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 90
def show_redis_uri
  load_bosh_and_validate_current_deployment
  print service_uri
end

Protected Instance Methods

bosh_director_client() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 126
def bosh_director_client
  @bosh_director_client ||= begin
    command = ::Bosh::Cli::Command::Deployment.new
    command.send(:auth_required)
    command.director
  end
end
bosh_release_dir() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 118
def bosh_release_dir
  File.expand_path("../../../bosh_release", __FILE__)
end
deployment_file() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 134
def deployment_file
  @current_deployment_file ||= ::Bosh::Cli::Command::Deployment.new.deployment
end
deployment_name() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 149
def deployment_name
  @deployment["name"]
end
load_bosh_and_validate_current_deployment() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 138
def load_bosh_and_validate_current_deployment
  require "cli" # bosh_cli's director client library
  unless File.exists?(deployment_file)
    fail "Target deployment file no longer exists: #{deployment_file}"
  end
  @deployment = YAML.load_file(deployment_file)
  unless @deployment["release"] && @deployment["release"]["name"] == release_name
    fail "Target deployment file is not for redis service: #{deployment_file}"
  end
end
release_name() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 114
def release_name
  "redis"
end
server_host() click to toggle source

returns the first DNS entry for the running instance

# File lib/redis-cf-plugin/plugin.rb, line 161
def server_host
  @server_host ||= begin
    vms = bosh_director_client.fetch_vm_state(deployment_name, use_cache: false)
    if vms.empty?
      fail "Deployment has no running instances"
    end
    if vms.size > 1
      warn "Deployment has more than 1 running instance (#{vms.size}); using first instance"
    end
    vm = vms.first
    vm["dns"].first
  end
end
service_uri() click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 153
def service_uri
  password = @deployment["properties"]["redis"]["password"]
  port = @deployment["properties"]["redis"]["port"]
  db = 0
  "redis://:#{password}@#{server_host}:#{port}/#{db}"
end
within_bosh_release(&block) click to toggle source
# File lib/redis-cf-plugin/plugin.rb, line 122
def within_bosh_release(&block)
  chdir(bosh_release_dir, &block)
end