class Formatron::CloudFormation::Template::VPC::Subnet::ChefServer

generates CloudFormation Chef Server resources rubocop:disable Metrics/ClassLength

Constants

ACCESS_KEY_PREFIX
USER_PREFIX

Public Class Methods

new( chef_server:, key_pair:, administrator_name:, administrator_password:, availability_zone:, subnet_guid:, hosted_zone_name:, vpc_guid:, vpc_cidr:, kms_key:, private_hosted_zone_id:, public_hosted_zone_id:, bucket:, name:, target: ) click to toggle source

rubocop:disable Metrics/MethodLength rubocop:disable Metrics/ParameterLists rubocop:disable Metrics/AbcSize

# File lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb, line 20
def initialize(
  chef_server:,
  key_pair:,
  administrator_name:,
  administrator_password:,
  availability_zone:,
  subnet_guid:,
  hosted_zone_name:,
  vpc_guid:,
  vpc_cidr:,
  kms_key:,
  private_hosted_zone_id:,
  public_hosted_zone_id:,
  bucket:,
  name:,
  target:
)
  @chef_server = chef_server
  @bucket = bucket
  guid = @chef_server.guid
  @ssl_cert_key = S3::ChefServerCert.cert_key(
    name: name,
    target: target,
    guid: guid
  )
  @ssl_key_key = S3::ChefServerCert.key_key(
    name: name,
    target: target,
    guid: guid
  )
  @user_pem_key = S3::ChefServerKeys.user_pem_key(
    name: name,
    target: target,
    guid: guid
  )
  @organization_pem_key =
    S3::ChefServerKeys.organization_pem_key(
      name: name,
      target: target,
      guid: guid
    )
  @user_id = "#{USER_PREFIX}#{guid}"
  @access_key_id = "#{ACCESS_KEY_PREFIX}#{guid}"
  @kms_key = kms_key
  @username = @chef_server.username
  @password = @chef_server.password
  @first_name = @chef_server.first_name
  @last_name = @chef_server.last_name
  @email = @chef_server.email
  @version = @chef_server.version
  @cookbooks_bucket = @chef_server.cookbooks_bucket
  organization = @chef_server.organization
  @organization_short_name = organization.short_name
  @organization_full_name = organization.full_name
  _set_default_instance_type
  _set_os
  _add_ssl_cert_policy
  _add_keys_policy
  _add_open_ports
  _add_setup_script
  @instance = Instance.new(
    instance: @chef_server,
    key_pair: key_pair,
    administrator_name: administrator_name,
    administrator_password: administrator_password,
    availability_zone: availability_zone,
    subnet_guid: subnet_guid,
    hosted_zone_name: hosted_zone_name,
    vpc_guid: vpc_guid,
    vpc_cidr: vpc_cidr,
    kms_key: @kms_key,
    private_hosted_zone_id: private_hosted_zone_id,
    public_hosted_zone_id: public_hosted_zone_id,
    bucket: @bucket,
    name: name,
    target: target
  )
end

Public Instance Methods

merge(resources:, outputs:) click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb, line 179
def merge(resources:, outputs:)
  _add_cookbooks_bucket_user resources
  @instance.merge resources: resources, outputs: outputs
end

Private Instance Methods

_add_cookbooks_bucket_user(resources) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb, line 185
def _add_cookbooks_bucket_user(resources)
  resources[@user_id] = Resources::IAM.user(
    policy_name: @user_id,
    statements: [{
      actions: %w(s3:PutObject s3:GetObject s3:DeleteObject),
      resources: "arn:aws:s3:::#{@cookbooks_bucket}/*"
    }, {
      actions: %w(s3:ListBucket),
      resources: "arn:aws:s3:::#{@cookbooks_bucket}"
    }]
  )
  resources[@access_key_id] = Resources::IAM.access_key(
    user_name: Template.ref(@user_id)
  )
end
_add_keys_policy() click to toggle source
# File lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb, line 124
def _add_keys_policy
  @chef_server.policy do |policy|
    policy.statement do |statement|
      statement.action 's3:PutObject'
      statement.resource "arn:aws:s3:::#{@bucket}/#{@user_pem_key}"
      statement.resource(
        "arn:aws:s3:::#{@bucket}/#{@organization_pem_key}"
      )
    end
  end
end
_add_open_ports() click to toggle source
# File lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb, line 136
def _add_open_ports
  @chef_server.security_group do |security_group|
    security_group.open_tcp_port 80
    security_group.open_tcp_port 443
  end
end
_add_setup_script() click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb, line 144
def _add_setup_script
  @chef_server.setup do |setup|
    scripts = setup.script
    scripts.unshift Scripts.chef_server(
      username: @username,
      first_name: @first_name,
      last_name: @last_name,
      email: @email,
      password: @password,
      organization_short_name: @organization_short_name,
      organization_full_name: @organization_full_name,
      bucket: @bucket,
      user_pem_key: @user_pem_key,
      organization_pem_key: @organization_pem_key,
      kms_key: @kms_key,
      chef_server_version: @version,
      ssl_cert_key: @ssl_cert_key,
      ssl_key_key: @ssl_key_key,
      cookbooks_bucket: @cookbooks_bucket
    )
    setup.variable 'REGION' do |variable|
      variable.value Template.ref('AWS::Region')
    end
    setup.variable 'ACCESS_KEY_ID' do |variable|
      variable.value Template.ref(@access_key_id)
    end
    setup.variable 'SECRET_ACCESS_KEY' do |variable|
      variable.value Template.get_attribute(
        @access_key_id, 'SecretAccessKey'
      )
    end
  end
end
_add_ssl_cert_policy() click to toggle source
# File lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb, line 114
def _add_ssl_cert_policy
  @chef_server.policy do |policy|
    policy.statement do |statement|
      statement.action 's3:GetObject'
      statement.resource "arn:aws:s3:::#{@bucket}/#{@ssl_cert_key}"
      statement.resource "arn:aws:s3:::#{@bucket}/#{@ssl_key_key}"
    end
  end
end
_set_default_instance_type() click to toggle source

rubocop:enable Metrics/AbcSize rubocop:enable Metrics/ParameterLists rubocop:enable Metrics/MethodLength

# File lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb, line 102
def _set_default_instance_type
  @chef_server.instance_type(
    't2.medium'
  ) if @chef_server.instance_type.nil?
end
_set_os() click to toggle source
# File lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb, line 108
def _set_os
  @chef_server.os(
    'ubuntu'
  )
end