Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions jobs/cloud_controller_clock/spec
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ templates:
cloud_controller_ng.yml.erb: config/cloud_controller_ng.yml
newrelic.yml.erb: config/newrelic.yml
stacks.yml.erb: config/stacks.yml
blobstore_configs.json.erb: config/blobstore_configs.json
drain.sh.erb: bin/drain
ruby_version.sh.erb: bin/ruby_version.sh
console.erb: bin/console
Expand Down Expand Up @@ -172,6 +173,8 @@ properties:
cc.staging_upload_password:
description: "User's password used to access internal endpoints of Cloud Controller to upload files when staging"

cc.resource_pool.blobstore_provider:
description: "The provider of blobstore storage cli to use. Valid values: ['AzureRM']"
cc.resource_pool.blobstore_type:
description: "The type of blobstore backing to use. Valid values: ['fog', 'webdav']"
default: "fog"
Expand Down Expand Up @@ -217,7 +220,11 @@ properties:
cc.resource_pool.cdn.key_pair_id:
description: "Key pair name for signed download URIs"
default: ""
cc.resource_pool.connection_config:
description: "Azure Storage Cli connection hash"

cc.packages.blobstore_provider:
description: "The provider of blobstore storage cli to use. Valid values: ['AzureRM']"
cc.packages.blobstore_type:
description: "The type of blobstore backing to use. Valid values: ['fog', 'webdav']"
default: "fog"
Expand Down Expand Up @@ -260,7 +267,11 @@ properties:
cc.packages.cdn.key_pair_id:
description: "Key pair name for signed download URIs"
default: ""
cc.packages.connection_config:
description: "Azure Storage Cli connection hash"

cc.droplets.blobstore_provider:
description: "The provider of blobstore storage cli to use. Valid values: ['AzureRM']"
cc.droplets.blobstore_type:
description: "The type of blobstore backing to use. Valid values: ['fog', 'webdav']"
default: "fog"
Expand Down Expand Up @@ -300,7 +311,11 @@ properties:
cc.droplets.cdn.key_pair_id:
description: "Key pair name for signed download URIs"
default: ""
cc.droplets.connection_config:
description: "Azure Storage Cli connection hash"

cc.buildpacks.blobstore_provider:
description: "The provider of blobstore storage cli to use. Valid values: ['AzureRM']"
cc.buildpacks.blobstore_type:
description: "The type of blobstore backing to use. Valid values: ['fog', 'webdav']"
default: "fog"
Expand Down Expand Up @@ -340,6 +355,8 @@ properties:
cc.buildpacks.cdn.key_pair_id:
description: "Key pair name for signed download URIs"
default: ""
cc.buildpacks.connection_config:
description: "Azure Storage Cli connection hash"

ccdb.databases:
description: "Contains the name of the database on the database server"
Expand Down
52 changes: 52 additions & 0 deletions jobs/cloud_controller_clock/templates/blobstore_configs.json.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<%
require "json"

def cli_cfg_with_default_timeout(connection_cfg, blobstore_type, default_seconds: 41)
cfg = (connection_cfg || {}).dup
if blobstore_type == 'storage_cli'
if !cfg.key?('put_timeout_in_seconds') || cfg['put_timeout_in_seconds'].to_s.empty?
cfg['put_timeout_in_seconds'] = default_seconds.to_s
end
end
cfg
end

def add(h, key, val)
return if val.nil?
return if val.respond_to?(:empty?) && val.empty?
h[key] = val
end

def options_for(scope_prefix, provider_prop)
provider = p(provider_prop, nil)
return {} unless provider == "AzureRM"

h = {}
h["provider"] = provider
h["account_name"] = p("#{scope_prefix}.azure_storage_account_name")
h["container_name"] = p("#{scope_prefix}.container_name")
add(h, "account_key", p("#{scope_prefix}.azure_storage_access_key"))
add(h, "environment", p("#{scope_prefix}.environment", "AzureCloud"))
add(h, "put_timeout_in_seconds", p("#{scope_prefix}.put_timeout_in_seconds", nil))

# optional passthrough for extra storage-cli flags
begin
custom = p("#{scope_prefix}.custom", {})
if custom.respond_to?(:each)
custom.each { |k, v| add(h, k.to_s, v) }
end
rescue
# property might not exist; ignore
end

cli_cfg_with_default_timeout(h, 'storage_cli')
end

all = {
"buildpacks" => options_for("cc.buildpacks.connection_config", "cc.buildpacks.blobstore_provider"),
"droplets" => options_for("cc.droplets.connection_config", "cc.droplets.blobstore_provider"),
"packages" => options_for("cc.packages.connection_config", "cc.packages.blobstore_provider"),
"resource_pool" => options_for("cc.resource_pool.connection_config", "cc.resource_pool.blobstore_provider"),
}
-%>
<%= JSON.pretty_generate(all) %>
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ readiness_port:
clock: <%= p("cc.readiness_port.clock") %>

pid_filename: /var/vcap/sys/run/cloud_controller_clock/cloud_controller_clock.pid

storage_cli_config_file_droplets: /var/vcap/jobs/cloud_controller_clock/config/storage_cli_config_droplets.json
storage_cli_config_file_buildpacks: /var/vcap/jobs/cloud_controller_clock/config/storage_cli_config_buildpacks.json
storage_cli_config_file_packages: /var/vcap/jobs/cloud_controller_clock/config/storage_cli_config_packages.json
storage_cli_config_file_resource_pool: /var/vcap/jobs/cloud_controller_clock/config/storage_cli_config_resource_pool.json

newrelic_enabled: false
development_mode: false

Expand Down
22 changes: 22 additions & 0 deletions jobs/cloud_controller_clock/templates/pre-start.sh.erb
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,30 @@ function setup_directories {
chown -R vcap:vcap "$LOG_DIR"
}

write_blobstore_scope_configs() {
local cfg_json="${CONFIG_DIR}/blobstore_configs.json"
if [[ ! -f "$cfg_json" ]]; then
echo "blobstore_configs.json not found at $cfg_json; skipping fan-out"
return 0
fi

# Use the packaged Ruby if you prefer; system Ruby is usually fine on CF VMs.
CFG="$cfg_json" DEST="$BUNDLER_DIR" ruby <<'RUBY'
require "json"
cfg_path = ENV.fetch("CFG")
dest = ENV.fetch("DEST")
data = JSON.parse(File.read(cfg_path))

%w[buildpacks droplets packages resource_pool].each do |k|
out = File.join(dest, "storage_cli_config_#{k}.json")
File.write(out, JSON.pretty_generate(data[k] || {}))
end
RUBY
}

function main {
setup_directories
write_blobstore_scope_configs
}

main
Expand Down
25 changes: 25 additions & 0 deletions jobs/cloud_controller_ng/spec
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ templates:
restart_drain.sh.erb: bin/restart_drain
resource_pool_ca_cert.pem.erb: config/certs/resource_pool_ca_cert.pem
shutdown_drain.rb.erb: bin/shutdown_drain
blobstore_configs.json.erb: config/blobstore_configs.json
ruby_version.sh.erb: bin/ruby_version.sh
seed_db.sh.erb: bin/seed_db
stack_check.sh.erb: bin/stack_check
Expand Down Expand Up @@ -115,6 +116,7 @@ provides:
- name: cloud_controller_internal
type: cloud_controller_internal
properties:
- cc.buildpacks.blobstore_provider
- cc.buildpacks.blobstore_type
- cc.buildpacks.buildpack_directory_key
- cc.buildpacks.cdn.key_pair_id
Expand Down Expand Up @@ -143,6 +145,7 @@ provides:
- cc.default_stack
- cc.default_app_lifecycle
- cc.disable_private_domain_cross_space_context_path_route_sharing
- cc.droplets.blobstore_provider
- cc.droplets.blobstore_type
- cc.droplets.cdn.key_pair_id
- cc.droplets.cdn.private_key
Expand Down Expand Up @@ -172,6 +175,7 @@ provides:
- cc.max_annotations_per_resource
- cc.maximum_health_check_timeout
- cc.packages.app_package_directory_key
- cc.packages.blobstore_provider
- cc.packages.blobstore_type
- cc.packages.cdn.key_pair_id
- cc.packages.cdn.private_key
Expand All @@ -187,6 +191,7 @@ provides:
- cc.packages.webdav_config.private_endpoint
- cc.packages.webdav_config.public_endpoint
- cc.packages.webdav_config.username
- cc.resource_pool.blobstore_provider
- cc.resource_pool.blobstore_type
- cc.resource_pool.cdn.key_pair_id
- cc.resource_pool.cdn.private_key
Expand Down Expand Up @@ -231,6 +236,10 @@ provides:
- cc.temporary_enable_deprecated_thin_webserver
- cc.custom_root_links
- cc.feature_flag_overrides
- cc.resource_pool.connection_config
- cc.packages.connection_config
- cc.droplets.connection_config
- cc.buildpacks.connection_config

consumes:
- name: database
Expand Down Expand Up @@ -512,6 +521,8 @@ properties:
default: default
description: "The name of the quota definition CC will fallback on for org and space limits from the list of quota definitions."

cc.resource_pool.blobstore_provider:
description: "The provider of blobstore storage cli to use. Valid values: ['AzureRM']"
cc.resource_pool.blobstore_type:
description: "The type of blobstore backing to use. Valid values: ['fog', 'webdav']"
default: "fog"
Expand Down Expand Up @@ -559,7 +570,11 @@ properties:
cc.resource_pool.cdn.key_pair_id:
description: "Key pair name for signed download URIs"
default: ""
cc.resource_pool.connection_config:
description: "Azure Storage Cli connection hash"

cc.packages.blobstore_provider:
description: "The provider of blobstore storage cli to use. Valid values: ['AzureRM']"
cc.packages.blobstore_type:
description: "The type of blobstore backing to use. Valid values: ['fog', 'webdav']"
default: "fog"
Expand Down Expand Up @@ -607,7 +622,11 @@ properties:
cc.packages.cdn.key_pair_id:
description: "Key pair name for signed download URIs"
default: ""
cc.packages.connection_config:
description: "Azure Storage Cli connection hash"

cc.droplets.blobstore_provider:
description: "The provider of blobstore storage cli to use. Valid values: ['AzureRM']"
cc.droplets.blobstore_type:
description: "The type of blobstore backing to use. Valid values: ['fog', 'webdav']"
default: "fog"
Expand Down Expand Up @@ -652,7 +671,11 @@ properties:
cc.droplets.cdn.key_pair_id:
description: "Key pair name for signed download URIs"
default: ""
cc.droplets.connection_config:
description: "Azure Storage Cli connection hash"

cc.buildpacks.blobstore_provider:
description: "The provider of blobstore storage cli to use. Valid values: ['AzureRM']"
cc.buildpacks.blobstore_type:
description: "The type of blobstore backing to use. Valid values: ['fog', 'webdav']"
default: "fog"
Expand Down Expand Up @@ -694,6 +717,8 @@ properties:
cc.buildpacks.cdn.key_pair_id:
description: "Key pair name for signed download URIs"
default: ""
cc.buildpacks.connection_config:
description: "Azure Storage Cli connection hash"

ccdb.databases:
description: "Contains the name of the database on the database server"
Expand Down
52 changes: 52 additions & 0 deletions jobs/cloud_controller_ng/templates/blobstore_configs.json.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<%
require "json"

def cli_cfg_with_default_timeout(connection_cfg, blobstore_type, default_seconds: 41)
cfg = (connection_cfg || {}).dup
if blobstore_type == 'storage_cli'
if !cfg.key?('put_timeout_in_seconds') || cfg['put_timeout_in_seconds'].to_s.empty?
cfg['put_timeout_in_seconds'] = default_seconds.to_s
end
end
cfg
end

def add(h, key, val)
return if val.nil?
return if val.respond_to?(:empty?) && val.empty?
h[key] = val
end

def options_for(scope_prefix, provider_prop)
provider = p(provider_prop, nil)
return {} unless provider == "AzureRM"

h = {}
h["provider"] = provider
h["account_name"] = p("#{scope_prefix}.azure_storage_account_name")
h["container_name"] = p("#{scope_prefix}.container_name")
add(h, "account_key", p("#{scope_prefix}.azure_storage_access_key"))
add(h, "environment", p("#{scope_prefix}.environment", "AzureCloud"))
add(h, "put_timeout_in_seconds", p("#{scope_prefix}.put_timeout_in_seconds", nil))

# optional passthrough for extra storage-cli flags
begin
custom = p("#{scope_prefix}.custom", {})
if custom.respond_to?(:each)
custom.each { |k, v| add(h, k.to_s, v) }
end
rescue
# property might not exist; ignore
end

cli_cfg_with_default_timeout(h, 'storage_cli')
end

all = {
"buildpacks" => options_for("cc.buildpacks.connection_config", "cc.buildpacks.blobstore_provider"),
"droplets" => options_for("cc.droplets.connection_config", "cc.droplets.blobstore_provider"),
"packages" => options_for("cc.packages.connection_config", "cc.packages.blobstore_provider"),
"resource_pool" => options_for("cc.resource_pool.connection_config", "cc.resource_pool.blobstore_provider"),
}
-%>
<%= JSON.pretty_generate(all) %>
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,11 @@ default_health_check_timeout: <%= p("cc.default_health_check_timeout") %>
maximum_health_check_timeout: <%= p("cc.maximum_health_check_timeout") %>

stacks_file: /var/vcap/jobs/cloud_controller_ng/config/stacks.yml
storage_cli_config_file_droplets: /var/vcap/jobs/cloud_controller_ng/config/storage_cli_config_droplets.json
storage_cli_config_file_buildpacks: /var/vcap/jobs/cloud_controller_ng/config/storage_cli_config_buildpacks.json
storage_cli_config_file_packages: /var/vcap/jobs/cloud_controller_ng/config/storage_cli_config_packages.json
storage_cli_config_file_resource_pool: /var/vcap/jobs/cloud_controller_ng/config/storage_cli_config_resource_pool.json


shared_isolation_segment_name: <%= p("cc.shared_isolation_segment_name") %>

Expand Down
23 changes: 23 additions & 0 deletions jobs/cloud_controller_ng/templates/pre-start.sh.erb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,28 @@ source ${CC_JOB_DIR}/bin/setup_local_blobstore.sh

source "${SCRIPT_DIR}/ruby_version.sh"

write_blobstore_scope_configs() {
local cfg_json="${CONFIG_DIR}/blobstore_configs.json"
if [[ ! -f "$cfg_json" ]]; then
echo "blobstore_configs.json not found at $cfg_json; skipping fan-out"
return 0
fi

# Use the packaged Ruby if you prefer; system Ruby is usually fine on CF VMs.
CFG="$cfg_json" DEST="$BUNDLER_DIR" ruby <<'RUBY'
require "json"
cfg_path = ENV.fetch("CFG")
dest = ENV.fetch("DEST")
data = JSON.parse(File.read(cfg_path))

%w[buildpacks droplets packages resource_pool].each do |k|
out = File.join(dest, "storage_cli_config_#{k}.json")
File.write(out, JSON.pretty_generate(data[k] || {}))
end
RUBY
}


function setup_nginx_directories {
mkdir -p "/var/vcap/sys/run/nginx_cc"
chown -R vcap:vcap "/var/vcap/sys/run/nginx_cc"
Expand Down Expand Up @@ -141,6 +163,7 @@ function start_consul_agent {
function main {
start_bosh_dns_or_consul
setup_directories
write_blobstore_scope_configs
<% if spec.bootstrap && p('cc.run_prestart_migrations') %>
stack_check
perform_migration
Expand Down
Loading