diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index d11a70e3b1d..3053bc7b6e6 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -5,8 +5,8 @@ COPY --from=docker:dind /usr/local/bin/docker /usr/local/bin/
RUN wget -q -O - https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | sudo apt-key add - \
&& echo "deb https://packages.cloudfoundry.org/debian stable main" | sudo tee /etc/apt/sources.list.d/cloudfoundry-cli.list \
&& apt-get update && export DEBIAN_FRONTEND=noninteractive \
- && apt-get install postgresql-client postgresql-client-common mariadb-client cf7-cli -y \
- && apt-get install -o Dpkg::Options::="--force-overwrite" cf8-cli -y \
+ && apt-get install postgresql-client postgresql-client-common mariadb-client -y \
+# && apt-get install -o Dpkg::Options::="--force-overwrite" cf8-cli -y \
&& gem install cf-uaac \
&& wget $(curl -s https://api.github.com/repos/cloudfoundry/credhub-cli/releases/latest | \
jq -r '.assets[] | select(.name|match("credhub-linux.*")) | .browser_download_url') -O credhub.tar.gz \
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index 965c12ecb32..4c1f38ececb 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -1,9 +1,10 @@
-version: '3'
-
+version: "3.8"
+name: "cloud_controller-dev"
services:
+
# Dev Container
codespace:
- container_name: codespace
+ container_name: devcontainer
build:
context: ../
dockerfile: .devcontainer/Dockerfile
@@ -13,55 +14,96 @@ services:
- ..:/workspace:cached
- /var/run/docker.sock:/var/run/docker.sock
networks:
- - codespace
+ - cloud_controller-dev-network
cap_add:
- SYS_PTRACE
security_opt:
- seccomp:unconfined
+
# Postgres
postgres:
container_name: postgres
image: postgres:13
environment:
POSTGRES_PASSWORD: supersecret
+ ports:
+ - "5432:5432"
networks:
- - codespace
+ - cloud_controller-dev-network
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
restart: unless-stopped
- # Postgres
+
+ # Mariadb
mariadb:
container_name: mariadb
image: mariadb:10.3
environment:
MARIADB_ROOT_PASSWORD: supersecret
+ ports:
+ - "3306:3306"
+ healthcheck:
+ test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
+ interval: 10s
+ timeout: 20s
+ retries: 3
networks:
- - codespace
+ - cloud_controller-dev-network
restart: unless-stopped
+
# UAA
uaa:
container_name: uaa
build:
context: library/uaa
dockerfile: Dockerfile
+ ports:
+ - "8080:8080"
+ healthcheck:
+ test: ["CMD", "curl", "-f", "http://localhost:8080/info"]
+ interval: 30s
+ timeout: 20s
+ retries: 3
networks:
- - codespace
+ - cloud_controller-dev-network
restart: unless-stopped
+
# Minio
minio:
container_name: minio
image: minio/minio:latest
- command: minio server --address :9001 /data
+ command: minio server --address ":9001" "/data"
+ ports:
+ - "9001:9001"
+ healthcheck:
+ test: ["CMD", "curl", "-f", "http://localhost:9001/minio/health/live"]
+ interval: 30s
+ timeout: 20s
+ retries: 3
networks:
- - codespace
+ - cloud_controller-dev-network
restart: unless-stopped
+
# CATS Configurable Service Broker
catsbroker:
container_name: catsbroker
build:
context: library/catsbroker
dockerfile: Dockerfile
+ ports:
+ - "9292:9292"
+ healthcheck:
+ test: ["CMD", "curl", "-f", "http://localhost:9292/v2/catalog"]
+ interval: 30s
+ timeout: 20s
+ retries: 3
networks:
- - codespace
+ - cloud_controller-dev-network
restart: unless-stopped
+
# Nginx
nginx:
container_name: nginx
@@ -70,10 +112,19 @@ services:
dockerfile: Dockerfile
args:
ENABLED_MODULES: nginx_upload_module
+ ports:
+ - "80:80"
+ - "443:443"
+ healthcheck:
+ test: ["CMD-SHELL", "wget -O /dev/null http://localhost || exit 1"]
+ interval: 5s
+ timeout: 10s
+ retries: 3
networks:
- - codespace
+ - cloud_controller-dev-network
volumes:
- ./library/nginx/conf:/usr/local/nginx/conf:ro
- - ../tmp:/tmp:cached
+ - ../tmp:/tmp
+
networks:
- codespace:
\ No newline at end of file
+ cloud_controller-dev-network:
\ No newline at end of file
diff --git a/.devcontainer/library/idea/.idea/.gitignore b/.devcontainer/library/idea/.idea/.gitignore
deleted file mode 100644
index 13566b81b01..00000000000
--- a/.devcontainer/library/idea/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/.devcontainer/library/idea/.idea/libraries/app_packager_zips.xml b/.devcontainer/library/idea/.idea/libraries/app_packager_zips.xml
deleted file mode 100644
index 8670e122ad3..00000000000
--- a/.devcontainer/library/idea/.idea/libraries/app_packager_zips.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.devcontainer/library/idea/.idea/libraries/fixtures.xml b/.devcontainer/library/idea/.idea/libraries/fixtures.xml
deleted file mode 100644
index 40dfe3482bc..00000000000
--- a/.devcontainer/library/idea/.idea/libraries/fixtures.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.devcontainer/library/idea/.idea/misc.xml b/.devcontainer/library/idea/.idea/misc.xml
deleted file mode 100644
index bbd1dd68f56..00000000000
--- a/.devcontainer/library/idea/.idea/misc.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.devcontainer/library/idea/.idea/modules.xml b/.devcontainer/library/idea/.idea/modules.xml
deleted file mode 100644
index d4a84da4a81..00000000000
--- a/.devcontainer/library/idea/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.devcontainer/library/idea/.idea/vcs.xml b/.devcontainer/library/idea/.idea/vcs.xml
deleted file mode 100644
index 35eb1ddfbbc..00000000000
--- a/.devcontainer/library/idea/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.devcontainer/library/idea/cloud_controller_ng.iml b/.devcontainer/library/idea/cloud_controller_ng.iml
deleted file mode 100644
index dd01ba668a2..00000000000
--- a/.devcontainer/library/idea/cloud_controller_ng.iml
+++ /dev/null
@@ -1,455 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.devcontainer/library/nginx/Dockerfile b/.devcontainer/library/nginx/Dockerfile
index 27fa2cfd6ca..a4bcb8be4bd 100644
--- a/.devcontainer/library/nginx/Dockerfile
+++ b/.devcontainer/library/nginx/Dockerfile
@@ -1,7 +1,7 @@
FROM alpine
RUN apk --no-cache add build-base pcre-dev openssl-dev gzip curl jq zlib-dev \
- && NGINX_VERSION=$(curl -s https://hub.docker.com/v2/repositories/library/nginx/tags | jq -r ".results[] | select(.images | any(.digest==\"$(curl -s https://hub.docker.com/v2/repositories/library/nginx/tags | jq -r '.results[] | select(.name=="stable").images[] | select(.architecture=="amd64").digest')\")) | .name " | grep "[0-9]*\.[0-9]*\.[0-9]") \
+ && NGINX_VERSION=$(curl -s https://nginx.org/en/download.html | grep -o -E -m 1 "nginx-[0-9]+\.[0-9]+\.[0-9]+" | cut -d'-' -f2 | head -n 1) \
&& UPLOAD_VERSION=$(curl -s https://api.github.com/repos/fdintino/nginx-upload-module/tags | jq -r '.[0].name') \
&& wget -P /tmp https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && tar -zxvf /tmp/nginx-${NGINX_VERSION}.tar.gz -C /tmp \
&& wget -P /tmp https://github.com/fdintino/nginx-upload-module/archive/${UPLOAD_VERSION}.tar.gz && tar -zxvf /tmp/${UPLOAD_VERSION}.tar.gz -C /tmp \
diff --git a/.devcontainer/library/nginx/conf/nginx.conf b/.devcontainer/library/nginx/conf/nginx.conf
index e97fc90d687..727a6e9cc92 100644
--- a/.devcontainer/library/nginx/conf/nginx.conf
+++ b/.devcontainer/library/nginx/conf/nginx.conf
@@ -39,7 +39,7 @@ http {
##
upstream cloud_controller {
- server unix:/tmp/cloud_controller.sock;
+ server host.docker.internal:3000;
}
include nginx_external_endpoints.conf;
diff --git a/.devcontainer/library/onCreateCommand.sh b/.devcontainer/library/onCreateCommand.sh
index ab7dc2641ad..8790fffc6a6 100755
--- a/.devcontainer/library/onCreateCommand.sh
+++ b/.devcontainer/library/onCreateCommand.sh
@@ -1,113 +1,11 @@
-#/bin/dash
-set -eux
+#/bin/bash
+set -eu
trap "pkill -P $$" EXIT
# Setup IDEs
-cp -a -f .devcontainer/library/vscode/.vscode/ .
-cp -a -f .devcontainer/library/idea/.idea/ .
-cp -a -f .devcontainer/library/idea/cloud_controller_ng.iml .
+./setupIDEs.sh
-# Install packages
-bundle install &
+# Setup DBs and CC Config File
+./setupEnvironment.sh
-# CC config
-cp -a config/cloud_controller.yml tmp/cloud_controller.yml
-
-yq -i e '.login.url="http://uaa:8080"' tmp/cloud_controller.yml
-yq -i e '.login.enabled=true' tmp/cloud_controller.yml
-
-yq -i e '.nginx.use_nginx=true' tmp/cloud_controller.yml
-yq -i e '.nginx.instance_socket="/workspaces/cloud_controller_ng/tmp/cloud_controller.sock"' tmp/cloud_controller.yml
-
-yq -i e '.logging.file="/workspaces/cloud_controller_ng/tmp/cloud_controller.log"' tmp/cloud_controller.yml
-yq -i e '.telemetry_log_path="/workspaces/cloud_controller_ng/tmp/cloud_controller_telemetry.log"' tmp/cloud_controller.yml
-yq -i e '.directories.tmpdir="/workspaces/cloud_controller_ng/tmp"' tmp/cloud_controller.yml
-yq -i e '.directories.diagnostics="/workspaces/cloud_controller_ng/tmp"' tmp/cloud_controller.yml
-yq -i e '.security_event_logging.enabled=true' tmp/cloud_controller.yml
-yq -i e '.security_event_logging.file="/workspaces/cloud_controller_ng/tmp/cef.log"' tmp/cloud_controller.yml
-
-yq -i e '.uaa.url="http://uaa:8080"' tmp/cloud_controller.yml
-yq -i e '.uaa.internal_url="http://uaa:8080"' tmp/cloud_controller.yml
-yq -i e '.uaa.resource_id="cloud_controller"' tmp/cloud_controller.yml
-yq -i e 'del(.uaa.symmetric_secret)' tmp/cloud_controller.yml
-
-yq -i e '.resource_pool.fog_connection.provider="AWS"' tmp/cloud_controller.yml
-yq -i e '.resource_pool.fog_connection.endpoint="http://minio:9001"' tmp/cloud_controller.yml
-yq -i e '.resource_pool.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
-yq -i e '.resource_pool.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
-yq -i e '.resource_pool.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
-yq -i e '.resource_pool.fog_connection.path_style=true' tmp/cloud_controller.yml
-
-yq -i e '.packages.fog_connection.provider="AWS"' tmp/cloud_controller.yml
-yq -i e '.packages.fog_connection.endpoint="http://minio:9001"' tmp/cloud_controller.yml
-yq -i e '.packages.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
-yq -i e '.packages.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
-yq -i e '.packages.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
-yq -i e '.packages.fog_connection.path_style=true' tmp/cloud_controller.yml
-
-yq -i e '.droplets.fog_connection.provider="AWS"' tmp/cloud_controller.yml
-yq -i e '.droplets.fog_connection.endpoint="http://minio:9001"' tmp/cloud_controller.yml
-yq -i e '.droplets.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
-yq -i e '.droplets.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
-yq -i e '.droplets.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
-yq -i e '.droplets.fog_connection.path_style=true' tmp/cloud_controller.yml
-
-yq -i e '.buildpacks.fog_connection.provider="AWS"' tmp/cloud_controller.yml
-yq -i e '.buildpacks.fog_connection.endpoint="http://minio:9001"' tmp/cloud_controller.yml
-yq -i e '.buildpacks.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
-yq -i e '.buildpacks.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
-yq -i e '.buildpacks.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
-yq -i e '.buildpacks.fog_connection.path_style=true' tmp/cloud_controller.yml
-
-yq -i e '.cloud_controller_username_lookup_client_name="login"' tmp/cloud_controller.yml
-yq -i e '.cloud_controller_username_lookup_client_secret="loginsecret"' tmp/cloud_controller.yml
-
-wait
-
-# Database setup
-POSTGRES_CONNECTION_STRING="postgres://postgres:supersecret@postgres:5432/ccdb"
-MYSQL_CONNECTION_STRING="mysql2://root:supersecret@mariadb:3306/ccdb"
-
-setupPostgres () {
- export DB="postgres"
- export DB_CONNECTION_STRING="${POSTGRES_CONNECTION_STRING}"
- bundle exec rake db:recreate
- bundle exec rake db:migrate
- bundle exec rake db:seed
-}
-
-
-setupMariadb () {
- export DB="mysql"
- export DB_CONNECTION_STRING="${MYSQL_CONNECTION_STRING}"
- bundle exec rake db:recreate
- bundle exec rake db:migrate
- bundle exec rake db:seed
-}
-
-setupPostgres &
-setupMariadb &
-
-setupUAA () {
- timeout 300 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' http://uaa:8080/info)" != "200" ]]; do sleep 5; done' || false
- CF_UAA_ADMIN_CLIENT_SECRET="adminsecret"
- NEW_ADMIN_USERNAME="ccadmin"
- NEW_ADMIN_PASSWORD="secret"
- uaac target http://uaa:8080 --skip-ssl-validation
- uaac token client get admin -s ${CF_UAA_ADMIN_CLIENT_SECRET}
- uaac user add ${NEW_ADMIN_USERNAME} -p ${NEW_ADMIN_PASSWORD} --emails fake@example.com
- uaac member add cloud_controller.admin ${NEW_ADMIN_USERNAME}
- uaac member add uaa.admin ${NEW_ADMIN_USERNAME}
- uaac member add scim.read ${NEW_ADMIN_USERNAME}
- uaac member add scim.write ${NEW_ADMIN_USERNAME}
-
- # Dasboard User
- uaac user add cc-service-dashboards -p some-sekret --emails fake2@example.com
- uaac member add cloud_controller_service_permissions.read cc-service-dashboards
- uaac member add openid cc-service-dashboards
-}
-
-setupUAA &
-
-wait
trap "" EXIT
\ No newline at end of file
diff --git a/.devcontainer/library/setupDevelopmentEnvironment.sh b/.devcontainer/library/setupDevelopmentEnvironment.sh
new file mode 100755
index 00000000000..8ceb29e4fcb
--- /dev/null
+++ b/.devcontainer/library/setupDevelopmentEnvironment.sh
@@ -0,0 +1,155 @@
+#/bin/bash
+set -eu
+trap "pkill -P $$" EXIT
+
+# Database setup
+POSTGRES_CONNECTION_STRING="postgres://postgres:supersecret@localhost:5432/ccdb"
+MYSQL_CONNECTION_STRING="mysql2://root:supersecret@127.0.0.1:3306/ccdb"
+
+setupPostgres () {
+ export DB="postgres"
+ export DB_CONNECTION_STRING="${POSTGRES_CONNECTION_STRING}"
+ bundle exec rake db:recreate
+ bundle exec rake db:migrate
+ bundle exec rake db:seed
+}
+
+
+setupMariadb () {
+ export DB="mysql"
+ export DB_CONNECTION_STRING="${MYSQL_CONNECTION_STRING}"
+ bundle exec rake db:recreate
+ bundle exec rake db:migrate
+ bundle exec rake db:seed
+}
+
+setupUAA () {
+ timeout 300 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' http://localhost:8080/info)" != "200" ]]; do sleep 5; done' || false
+ CF_UAA_ADMIN_CLIENT_SECRET="adminsecret"
+ NEW_ADMIN_USERNAME="ccadmin"
+ NEW_ADMIN_PASSWORD="secret"
+ uaac target http://localhost:8080 --skip-ssl-validation
+ uaac token client get admin -s ${CF_UAA_ADMIN_CLIENT_SECRET}
+ uaac user add ${NEW_ADMIN_USERNAME} -p ${NEW_ADMIN_PASSWORD} --emails fake@example.com
+ uaac member add cloud_controller.admin ${NEW_ADMIN_USERNAME}
+ uaac member add uaa.admin ${NEW_ADMIN_USERNAME}
+ uaac member add scim.read ${NEW_ADMIN_USERNAME}
+ uaac member add scim.write ${NEW_ADMIN_USERNAME}
+
+ # Dasboard User
+ uaac user add cc-service-dashboards -p some-sekret --emails fake2@example.com
+ uaac member add cloud_controller_service_permissions.read cc-service-dashboards
+ uaac member add openid cc-service-dashboards
+}
+
+# CC config
+cp -a config/cloud_controller.yml tmp/cloud_controller.yml
+
+#yq -i e '.login.url="http://uaa:8080"' tmp/cloud_controller.yml
+#yq -i e '.login.enabled=true' tmp/cloud_controller.yml
+#
+#yq -i e '.nginx.use_nginx=true' tmp/cloud_controller.yml
+#yq -i e '.nginx.instance_socket=""' tmp/cloud_controller.yml
+#
+#yq -i e '.logging.file="tmp/cloud_controller.log"' tmp/cloud_controller.yml
+#yq -i e '.telemetry_log_path="tmp/cloud_controller_telemetry.log"' tmp/cloud_controller.yml
+#yq -i e '.directories.tmpdir="tmp"' tmp/cloud_controller.yml
+#yq -i e '.directories.diagnostics="tmp"' tmp/cloud_controller.yml
+#yq -i e '.security_event_logging.enabled=true' tmp/cloud_controller.yml
+#yq -i e '.security_event_logging.file="tmp/cef.log"' tmp/cloud_controller.yml
+#
+#yq -i e '.uaa.url="http://uaa:8080"' tmp/cloud_controller.yml
+#yq -i e '.uaa.internal_url="http://uaa:8080"' tmp/cloud_controller.yml
+#yq -i e '.uaa.resource_id="cloud_controller"' tmp/cloud_controller.yml
+#yq -i e 'del(.uaa.symmetric_secret)' tmp/cloud_controller.yml
+#
+#yq -i e '.resource_pool.fog_connection.provider="AWS"' tmp/cloud_controller.yml
+#yq -i e '.resource_pool.fog_connection.endpoint="http://minio:9001"' tmp/cloud_controller.yml
+#yq -i e '.resource_pool.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
+#yq -i e '.resource_pool.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
+#yq -i e '.resource_pool.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
+#yq -i e '.resource_pool.fog_connection.path_style=true' tmp/cloud_controller.yml
+#
+#yq -i e '.packages.fog_connection.provider="AWS"' tmp/cloud_controller.yml
+#yq -i e '.packages.fog_connection.endpoint="http://minio:9001"' tmp/cloud_controller.yml
+#yq -i e '.packages.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
+#yq -i e '.packages.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
+#yq -i e '.packages.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
+#yq -i e '.packages.fog_connection.path_style=true' tmp/cloud_controller.yml
+#
+#yq -i e '.droplets.fog_connection.provider="AWS"' tmp/cloud_controller.yml
+#yq -i e '.droplets.fog_connection.endpoint="http://minio:9001"' tmp/cloud_controller.yml
+#yq -i e '.droplets.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
+#yq -i e '.droplets.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
+#yq -i e '.droplets.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
+#yq -i e '.droplets.fog_connection.path_style=true' tmp/cloud_controller.yml
+#
+#yq -i e '.buildpacks.fog_connection.provider="AWS"' tmp/cloud_controller.yml
+#yq -i e '.buildpacks.fog_connection.endpoint="http://minio:9001"' tmp/cloud_controller.yml
+#yq -i e '.buildpacks.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
+#yq -i e '.buildpacks.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
+#yq -i e '.buildpacks.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
+#yq -i e '.buildpacks.fog_connection.path_style=true' tmp/cloud_controller.yml
+#
+#yq -i e '.cloud_controller_username_lookup_client_name="login"' tmp/cloud_controller.yml
+#yq -i e '.cloud_controller_username_lookup_client_secret="loginsecret"' tmp/cloud_controller.yml
+
+
+yq -i e '.login.url="http://localhost:8080"' tmp/cloud_controller.yml
+yq -i e '.login.enabled=true' tmp/cloud_controller.yml
+
+yq -i e '.nginx.use_nginx=true' tmp/cloud_controller.yml
+yq -i e '.nginx.instance_socket=""' tmp/cloud_controller.yml
+
+yq -i e '.logging.file="tmp/cloud_controller.log"' tmp/cloud_controller.yml
+yq -i e '.telemetry_log_path="tmp/cloud_controller_telemetry.log"' tmp/cloud_controller.yml
+yq -i e '.directories.tmpdir="tmp"' tmp/cloud_controller.yml
+yq -i e '.directories.diagnostics="tmp"' tmp/cloud_controller.yml
+yq -i e '.security_event_logging.enabled=true' tmp/cloud_controller.yml
+yq -i e '.security_event_logging.file="tmp/cef.log"' tmp/cloud_controller.yml
+
+yq -i e '.uaa.url="http://localhost:8080"' tmp/cloud_controller.yml
+yq -i e '.uaa.internal_url="http://localhost:8080"' tmp/cloud_controller.yml
+yq -i e '.uaa.resource_id="cloud_controller"' tmp/cloud_controller.yml
+yq -i e 'del(.uaa.symmetric_secret)' tmp/cloud_controller.yml
+
+yq -i e '.resource_pool.fog_connection.provider="AWS"' tmp/cloud_controller.yml
+yq -i e '.resource_pool.fog_connection.endpoint="http://localhost:9001"' tmp/cloud_controller.yml
+yq -i e '.resource_pool.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
+yq -i e '.resource_pool.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
+yq -i e '.resource_pool.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
+yq -i e '.resource_pool.fog_connection.path_style=true' tmp/cloud_controller.yml
+
+yq -i e '.packages.fog_connection.provider="AWS"' tmp/cloud_controller.yml
+yq -i e '.packages.fog_connection.endpoint="http://localhost:9001"' tmp/cloud_controller.yml
+yq -i e '.packages.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
+yq -i e '.packages.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
+yq -i e '.packages.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
+yq -i e '.packages.fog_connection.path_style=true' tmp/cloud_controller.yml
+
+yq -i e '.droplets.fog_connection.provider="AWS"' tmp/cloud_controller.yml
+yq -i e '.droplets.fog_connection.endpoint="http://localhost:9001"' tmp/cloud_controller.yml
+yq -i e '.droplets.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
+yq -i e '.droplets.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
+yq -i e '.droplets.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
+yq -i e '.droplets.fog_connection.path_style=true' tmp/cloud_controller.yml
+
+yq -i e '.buildpacks.fog_connection.provider="AWS"' tmp/cloud_controller.yml
+yq -i e '.buildpacks.fog_connection.endpoint="http://localhost:9001"' tmp/cloud_controller.yml
+yq -i e '.buildpacks.fog_connection.aws_access_key_id="minioadmin"' tmp/cloud_controller.yml
+yq -i e '.buildpacks.fog_connection.aws_secret_access_key="minioadmin"' tmp/cloud_controller.yml
+yq -i e '.buildpacks.fog_connection.aws_signature_version=2' tmp/cloud_controller.yml
+yq -i e '.buildpacks.fog_connection.path_style=true' tmp/cloud_controller.yml
+
+yq -i e '.cloud_controller_username_lookup_client_name="login"' tmp/cloud_controller.yml
+yq -i e '.cloud_controller_username_lookup_client_secret="loginsecret"' tmp/cloud_controller.yml
+
+setupPostgres
+setupMariadb
+setupUAA
+
+# Install packages
+bundle install
+
+
+trap "" EXIT
\ No newline at end of file
diff --git a/.devcontainer/library/setupIDEs.sh b/.devcontainer/library/setupIDEs.sh
new file mode 100755
index 00000000000..c45164ecc33
--- /dev/null
+++ b/.devcontainer/library/setupIDEs.sh
@@ -0,0 +1,9 @@
+#/bin/bash
+set -eu
+trap "pkill -P $$" EXIT
+
+# Setup IDEs
+cp -a -f .devcontainer/library/vscode/.vscode .
+cp -a -f .devcontainer/library/idea/.idea .
+
+trap "" EXIT
\ No newline at end of file
diff --git a/devenv.sh b/devenv.sh
new file mode 100755
index 00000000000..72a2834515c
--- /dev/null
+++ b/devenv.sh
@@ -0,0 +1,105 @@
+#/bin/bash
+set -eu
+trap "pkill -P $$" EXIT
+
+# Prerequisits
+# PSQL
+# MYSQL
+# RUBY(RBENV)
+# RUBY BUNDLER
+# UAAC (gem install cf-uaac)
+# Docker
+# Docker-Compose
+
+# Help text
+help_command() {
+ echo "Usage: $0 COMMAND"
+ echo ""
+ echo "Commands:"
+ echo " create - Setting up the development environment(containers)"
+ echo " start - Starting the development environment(containers), a existing fully set up set of containers must exist."
+ echo " stop - Stopping but not removing the development environment(containers)"
+ echo " destroy - Stopping and removing the development environment(containers)"
+ echo " runconfigs - Copies matching run configurations for intellij and vscode into the respective folders"
+ echo " help - Print this help text"
+}
+
+
+# Start Docker Containers
+create_command(){
+ pushd .devcontainer
+ docker-compose -p "" up -d
+ popd
+
+ ./.devcontainer/library/setupDevelopmentEnvironment.sh
+}
+
+# Start Docker Containers
+start_command(){
+ pushd .devcontainer
+ docker-compose -p "" start
+ popd
+}
+
+# Stop Docker Containers
+stop_command(){
+ pushd .devcontainer
+ docker-compose -p "" stop
+ popd
+}
+
+# Stop Docker Containers
+destroy_command(){
+ pushd .devcontainer
+ docker-compose -p "" down
+ popd
+}
+
+# Call Setup IDEs Script
+runconfigs_command(){
+ ./.devcontainer/library/setupIDEs.sh
+}
+
+# Error handler
+handle_error() {
+ echo "Error: Invalid command"
+ help_command
+ exit 1
+}
+
+# Handle no command specified
+if [ $# -eq 0 ]; then
+ handle_error
+fi
+
+# Parse commands
+case "$1" in
+ create)
+ echo "Setting up the development environment(containers)"
+ create_command
+ ;;
+ start)
+ echo "Starting the development environment(containers), a existing fully set up set of containers must exist."
+ start_command
+ ;;
+ stop)
+ echo "Stopping but not removing the development environment(containers)"
+ stop_command
+ ;;
+ destroy)
+ echo "Stopping and removing the development environment(containers)"
+ destroy_command
+ ;;
+ runconfigs)
+ echo "Copying matching run configurations for intellij and vscode into the respective folders"
+ runconfigs_command
+ ;;
+ help)
+ help_command
+ ;;
+ *)
+ handle_error
+ ;;
+esac
+
+trap "" EXIT
\ No newline at end of file