From 45388de4e10aa046695d219d9732d8f9610c48e0 Mon Sep 17 00:00:00 2001 From: Jake Spain Date: Mon, 14 Aug 2023 10:01:19 -0400 Subject: [PATCH] Improve development experience --- .gitignore | 3 +- README.md | 37 ++++++------ docker/.dockerignore | 8 ++- docker/.rerun | 2 + docker/Dockerfile | 2 +- docker/{Dockerfile.local => Dockerfile.dev} | 14 ++--- docker/Gemfile.dev | 11 ++++ docker/Gemfile.local | 7 --- docker/data/vmpooler.yaml | 56 ------------------- ...mpose.local.yml => docker-compose.dev.yml} | 16 +++++- docker/docker-entrypoint.dev.sh | 8 +++ docker/vmpooler.yaml | 54 ++++++++++++++++++ 12 files changed, 119 insertions(+), 99 deletions(-) create mode 100644 docker/.rerun rename docker/{Dockerfile.local => Dockerfile.dev} (67%) create mode 100644 docker/Gemfile.dev delete mode 100644 docker/Gemfile.local delete mode 100644 docker/data/vmpooler.yaml rename docker/{docker-compose.local.yml => docker-compose.dev.yml} (88%) create mode 100755 docker/docker-entrypoint.dev.sh create mode 100644 docker/vmpooler.yaml diff --git a/.gitignore b/.gitignore index 2bc363e..06213b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ /*/**/vendor/bundle/ -/docker/**/vmpooler.yaml +/docker/data/vmpooler*.yaml /docker/data/*.json .vagrant/ .idea/ helm-charts/vmpooler/charts/ /docker/data/redis/** -!docker/data/**/*.yaml !docker/data/**/.gitkeep \ No newline at end of file diff --git a/README.md b/README.md index 3582fd8..9bcc34b 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,16 @@ # vmpooler-deployment -- [VMPooler Components](#vmpooler-components) -- [Docker Registry](#docker-registry) -- [Helm Repository](#helm-repository) - - [Adding / updating charts](#adding--updating-charts) -- [Development](#development) - - [Docker Compose URLs](#docker-compose-urls) - - [Deploy Chart for Testing](#deploy-chart-for-testing) -- [Releasing](#releasing) -- [Contributing](#contributing) -- [License](#license) +- [vmpooler-deployment](#vmpooler-deployment) + - [VMPooler Components](#vmpooler-components) + - [Docker Registry](#docker-registry) + - [Helm Repository](#helm-repository) + - [Adding / updating charts](#adding--updating-charts) + - [Development](#development) + - [Docker Compose URLs](#docker-compose-urls) + - [Deploy Chart for Testing](#deploy-chart-for-testing) + - [Releasing](#releasing) + - [Contributing](#contributing) + - [License](#license) This repo contains Dockerfiles and a Helm chart that can be used to deploy [VMPooler](https://github.com/puppetlabs/vmpooler). The Release Engineering team at Puppet uses the code here as part of operating our VMPooler instances. @@ -64,21 +65,21 @@ Prerequisites: ```bash |-- vmpooler-projects + | |--vmpooler | |--vmpooler-deployment - | |--vmpooler-dns-google-clouddns + | |--vmpooler-dns-gcp | |--vmpooler-provider-ec2 | |--vmpooler-provider-gce | |--vmpooler-provider-vsphere ``` - 2. From the `vmpooler-projects` directory run `docker build -t vmpooler-local -f vmpooler-deployment/docker/Dockerfile.local .` - 3. Run `docker compose -f vmpooler-deployment/docker/docker-compose.local.yml up` + 2. From the `vmpooler-projects/vmpooler-deployment` directory run `docker compose -f docker/docker-compose.dev.yml up --build` - Develop via Git source: - 4. For the component(s) you are developing on, commit and push changes to a branch. - 5. Change to the `docker` directory and modify the `Gemfile` as needed to pull the gem(s) from your git branch. - 6. Run `./update-gemfile-lock` to update the `Gemfile.lock` - 7. Run `docker compose build && docker compose up`. + 1. For the component(s) you are developing on, commit and push changes to a branch. + 2. Change to the `docker` directory and modify the `Gemfile` as needed to pull the gem(s) from your git branch. + 3. Run `./update-gemfile-lock` to update the `Gemfile.lock` + 4. Run `docker compose build && docker compose up`. When a dependency Helm chart is updated, be sure to run `./update-chart-lock` to update the lockfile, otherwise the test and release workflows will fail. @@ -91,7 +92,7 @@ These are the default ports used in the docker compose file, to change them edit | Redis Server | `localhost:6379` (Password: `vmpooler`) | | Redis Commander | (Credentials: `admin:admin`) | | Jaeger | -| VMPooler API | | +| VMPooler API | | | VMPooler Dashboard | | | Metrics (API) | | | Metrics (Manager) | | diff --git a/docker/.dockerignore b/docker/.dockerignore index 5052e88..9139fa7 100644 --- a/docker/.dockerignore +++ b/docker/.dockerignore @@ -1,6 +1,8 @@ # Exclude everything by default; explicitly include necessary files * -!Gemfile -!Gemfile.lock -!Gemfile.local +!.rerun +!docker-entrypoint.dev.sh !docker-entrypoint.sh +!Gemfile +!Gemfile.dev +!Gemfile.lock diff --git a/docker/.rerun b/docker/.rerun new file mode 100644 index 0000000..62d33dd --- /dev/null +++ b/docker/.rerun @@ -0,0 +1,2 @@ +--dir /opt/vmpooler-projects/ +--pattern **/lib/**/*.{erb,rb} diff --git a/docker/Dockerfile b/docker/Dockerfile index 157c5a1..1e8d560 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -31,7 +31,7 @@ RUN chmod +x /usr/local/bin/docker-entrypoint.sh COPY ./Gemfile* ./ -RUN bundle config set --local jobs 3 && \ +RUN bundle config set --local jobs 3 without development && \ bundle install ENTRYPOINT ["docker-entrypoint.sh"] diff --git a/docker/Dockerfile.local b/docker/Dockerfile.dev similarity index 67% rename from docker/Dockerfile.local rename to docker/Dockerfile.dev index 8dfb0c8..2a1373a 100644 --- a/docker/Dockerfile.local +++ b/docker/Dockerfile.dev @@ -24,21 +24,15 @@ RUN apt-get update -qq && \ apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/* -COPY vmpooler /opt/vmpooler -COPY vmpooler-dns-gcp /opt/vmpooler-dns-gcp -COPY vmpooler-provider-ec2 /opt/vmpooler-provider-ec2 -COPY vmpooler-provider-gce /opt/vmpooler-provider-gce -COPY vmpooler-provider-vsphere /opt/vmpooler-provider-vsphere - RUN gem install bundler -COPY vmpooler-deployment/docker/docker-entrypoint.sh /usr/local/bin/ +COPY docker-entrypoint.dev.sh /usr/local/bin/docker-entrypoint.sh RUN chmod +x /usr/local/bin/docker-entrypoint.sh -COPY vmpooler-deployment/docker/Gemfile.local ./Gemfile +COPY Gemfile.dev ./Gemfile +COPY .rerun ./.rerun -RUN bundle config set --local jobs 3 && \ - bundle install +RUN bundle config set --local jobs 3 ENTRYPOINT ["docker-entrypoint.sh"] diff --git a/docker/Gemfile.dev b/docker/Gemfile.dev new file mode 100644 index 0000000..1a54702 --- /dev/null +++ b/docker/Gemfile.dev @@ -0,0 +1,11 @@ +source ENV['GEM_SOURCE'] || 'https://rubygems.org' + +gem 'vmpooler', path: '/opt/vmpooler-projects/vmpooler' +gem 'vmpooler-dns-gcp', path: '/opt/vmpooler-projects/vmpooler-dns-gcp' +# gem 'vmpooler-provider-ec2', path: '/opt/vmpooler-projects/vmpooler-provider-ec2' +gem 'vmpooler-provider-gce', path: '/opt/vmpooler-projects/vmpooler-provider-gce' +gem 'vmpooler-provider-vsphere', path: '/opt/vmpooler-projects/vmpooler-provider-vsphere' + +group :development do + gem 'rerun', '~> 0.14' +end diff --git a/docker/Gemfile.local b/docker/Gemfile.local deleted file mode 100644 index 7613050..0000000 --- a/docker/Gemfile.local +++ /dev/null @@ -1,7 +0,0 @@ -source ENV['GEM_SOURCE'] || 'https://rubygems.org' - -gem 'vmpooler', path: '/opt/vmpooler' -gem 'vmpooler-dns-gcp', path: '/opt/vmpooler-dns-gcp' -gem 'vmpooler-provider-ec2', path: '/opt/vmpooler-provider-ec2' -gem 'vmpooler-provider-gce', path: '/opt/vmpooler-provider-gce' -gem 'vmpooler-provider-vsphere', path: '/opt/vmpooler-provider-vsphere' \ No newline at end of file diff --git a/docker/data/vmpooler.yaml b/docker/data/vmpooler.yaml deleted file mode 100644 index 1355be2..0000000 --- a/docker/data/vmpooler.yaml +++ /dev/null @@ -1,56 +0,0 @@ ---- -:dns_configs: - ddns_domain: 'dynamic.example.com' - :gcp-clouddns: - project: vmpooler-example - domain: vmpooler.example.com - dns_zone_resource_name: vmpooler-example-com - -:providers: - # :gce: - # network_name: projects/vmpooler-example/global/networks/default - # project: vmpooler-example - # title: gce - # zone: us-west1-b - - :dummy: - filename: '/tmp/dummy-backing.yaml' - -:prometheus: - prefix: 'vmpooler-local' - -:redis: - server: 'redis-server' - -:auth: - provider: 'dummy' - -:config: - site_name: 'vmpooler' - logfile: '/var/log/vmpooler.log' - task_limit: 10 - timeout: 15 - vm_checktime: 1 - vm_lifetime: 12 - vm_lifetime_auth: 24 - allowed_tags: - - 'created_by' - - 'project' - -:pools: - # - name: 'fedora-36-x86_64' - # template: 'projects/fedora-cloud/global/images/fedora-cloud-base-gcp-36-20220506-n-0-x86-64' - # size: 0 - # provider: 'gce' - # dns_plugin: 'google-clouddns' - # machine_type: 'zones/us-west1-b/machineTypes/n1-standard-2' - # disk_type: 'pd-ssd' - # subnetwork_name: 'projects/vmpooler-example/regions/us-west1/subnetworks/default' - - name: 'debian-11-x86_64' - template: 'Templates/debian-11-x86_64' - folder: 'Pooled VMs/debian-11-x86_64' - datastore: 'vmstorage' - size: 5 - timeout: 15 - ready_ttl: 1440 - provider: dummy diff --git a/docker/docker-compose.local.yml b/docker/docker-compose.dev.yml similarity index 88% rename from docker/docker-compose.local.yml rename to docker/docker-compose.dev.yml index a3c8dbe..6899a4c 100644 --- a/docker/docker-compose.local.yml +++ b/docker/docker-compose.dev.yml @@ -36,8 +36,14 @@ services: vmpooler-api: # See image build instructions in README and Dockerfile.local - image: vmpooler-local + build: + context: . + dockerfile: ./Dockerfile.dev + tty: true volumes: + - type: bind + source: ../../ + target: /opt/vmpooler-projects - type: bind source: ./data/vmpooler.yaml target: /etc/vmpooler/vmpooler.yaml @@ -63,8 +69,14 @@ services: vmpooler-manager: # See image build instructions in README and Dockerfile.local - image: vmpooler-local + build: + context: . + dockerfile: ./Dockerfile.dev + tty: true volumes: + - type: bind + source: ../../ + target: /opt/vmpooler-projects - type: bind source: ./data/vmpooler.yaml target: /etc/vmpooler/vmpooler.yaml diff --git a/docker/docker-entrypoint.dev.sh b/docker/docker-entrypoint.dev.sh new file mode 100755 index 0000000..9b32003 --- /dev/null +++ b/docker/docker-entrypoint.dev.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -e + +bundle install + +set -- rerun -- bundle exec vmpooler "$@" + +exec "$@" diff --git a/docker/vmpooler.yaml b/docker/vmpooler.yaml new file mode 100644 index 0000000..09146a5 --- /dev/null +++ b/docker/vmpooler.yaml @@ -0,0 +1,54 @@ +--- +:providers: + :dummy: + filename: '/tmp/dummy-backing.yaml' + +:dns_configs: + :example: + dns_class: dynamic-dns + #domain: 'localhost' # Flip these out for local requests + domain: 'example.com' + +:redis: + server: 'localhost' + +:auth: + provider: 'dummy' + +:tagfilter: + url: '(.*)\/' + +:config: + site_name: 'vmpooler' + logfile: '/var/log/vmpooler.log' + task_limit: 10 + timeout: 15 + vm_checktime: 1 + vm_lifetime: 12 + vm_lifetime_auth: 24 + allowed_tags: + - 'created_by' + - 'project' + prefix: 'poolvm-' + +:pools: + - name: 'debian-7-i386' + alias: [ 'debian-7-32' ] + template: 'Templates/debian-7-i386' + folder: 'Pooled VMs/debian-7-i386' + datastore: 'vmstorage' + size: 5 + timeout: 15 + ready_ttl: 1440 + provider: dummy + dns_plugin: 'example' + - name: 'debian-7-x86_64' + alias: [ 'debian-7-64', 'debian-7-amd64' ] + template: 'Templates/debian-7-x86_64' + folder: 'Pooled VMs/debian-7-x86_64' + datastore: 'vmstorage' + size: 5 + timeout: 15 + ready_ttl: 1440 + provider: dummy + dns_plugin: 'example'