From 3a73ceb0f9993b6e9c9caaea9cfa418d48f77de0 Mon Sep 17 00:00:00 2001 From: Zakir Dzhamaliddinov Date: Thu, 7 Nov 2024 12:00:50 +0300 Subject: [PATCH] Support terraform config generation from agent template --- .gitignore | 4 +-- lib/core/terraform_config/agent.rb | 23 +++++++++++++ lib/core/terraform_config/generator.rb | 6 +++- spec/command/terraform/generate_spec.rb | 1 + spec/core/terraform_config/agent_spec.rb | 34 ++++++++++++++++++++ spec/core/terraform_config/generator_spec.rb | 28 ++++++++++++++++ spec/dummy/.controlplane/templates/agent.yml | 5 +++ 7 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 lib/core/terraform_config/agent.rb create mode 100644 spec/core/terraform_config/agent_spec.rb create mode 100644 spec/dummy/.controlplane/templates/agent.yml diff --git a/.gitignore b/.gitignore index a977a4d4..b0cb4689 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,5 @@ /spec/dummy/.controlplane/controlplane*-tmp-*.yml # Generated configs -terraform/ -.controlplane/ +/terraform/ +/.controlplane/ diff --git a/lib/core/terraform_config/agent.rb b/lib/core/terraform_config/agent.rb new file mode 100644 index 00000000..08508e1d --- /dev/null +++ b/lib/core/terraform_config/agent.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module TerraformConfig + class Agent < Base + attr_reader :name, :description, :tags + + def initialize(name:, description: nil, tags: nil) + super() + + @name = name + @description = description + @tags = tags + end + + def to_tf + block :resource, :cpln_agent, name do + argument :name, name + argument :description, description, optional: true + argument :tags, tags, optional: true + end + end + end +end diff --git a/lib/core/terraform_config/generator.rb b/lib/core/terraform_config/generator.rb index f0cd9b3a..97bf2cc7 100644 --- a/lib/core/terraform_config/generator.rb +++ b/lib/core/terraform_config/generator.rb @@ -2,7 +2,7 @@ module TerraformConfig class Generator # rubocop:disable Metrics/ClassLength - SUPPORTED_TEMPLATE_KINDS = %w[gvc secret identity policy volumeset workload].freeze + SUPPORTED_TEMPLATE_KINDS = %w[gvc secret identity policy volumeset workload agent].freeze WORKLOAD_SPEC_KEYS = %i[ type containers @@ -104,6 +104,10 @@ def volumeset_config_params template.slice(:name, :description, :tags).merge(gvc: gvc).merge(specs) end + def agent_config_params + template.slice(:name, :description, :tags) + end + def workload_config_params template .slice(:name, :description, :tags) diff --git a/spec/command/terraform/generate_spec.rb b/spec/command/terraform/generate_spec.rb index ac17b508..2befd9db 100644 --- a/spec/command/terraform/generate_spec.rb +++ b/spec/command/terraform/generate_spec.rb @@ -23,6 +23,7 @@ maintenance maintenance_envs maintenance-with-external-image + agents ].freeze describe Command::Terraform::Generate do diff --git a/spec/core/terraform_config/agent_spec.rb b/spec/core/terraform_config/agent_spec.rb new file mode 100644 index 00000000..efd9228b --- /dev/null +++ b/spec/core/terraform_config/agent_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require "spec_helper" + +describe TerraformConfig::Agent do + let(:config) { described_class.new(**options) } + + describe "#to_tf" do + subject(:generated) { config.to_tf } + + let(:options) do + { + name: "agent-name", + description: "agent description", + tags: { "tag1" => "true", "tag2" => "value" } + } + end + + it "generates correct config" do + expect(generated).to eq( + <<~EXPECTED + resource "cpln_agent" "agent-name" { + name = "agent-name" + description = "agent description" + tags = { + tag1 = "true" + tag2 = "value" + } + } + EXPECTED + ) + end + end +end diff --git a/spec/core/terraform_config/generator_spec.rb b/spec/core/terraform_config/generator_spec.rb index 976380fe..3a37cdca 100644 --- a/spec/core/terraform_config/generator_spec.rb +++ b/spec/core/terraform_config/generator_spec.rb @@ -531,4 +531,32 @@ expect(main_tf_config.job).to be_nil end end + + context "when template's kind is agent" do + let(:template) do + { + "kind" => "agent", + "name" => "agent-name", + "description" => "agent description", + "tags" => { "tag1" => "tag1_value", "tag2" => "tag2_value" } + } + end + + it "generates correct terraform config and filename for it", :aggregate_failures do + expected_filename = "agents.tf" + + tf_configs = generator.tf_configs + expect(tf_configs.count).to eq(1) + + filenames = tf_configs.keys + expect(filenames).to contain_exactly(expected_filename) + + tf_config = tf_configs[expected_filename] + expect(tf_config).to be_an_instance_of(TerraformConfig::Agent) + + expect(tf_config.name).to eq("agent-name") + expect(tf_config.description).to eq("agent description") + expect(tf_config.tags).to eq(tag1: "tag1_value", tag2: "tag2_value") + end + end end diff --git a/spec/dummy/.controlplane/templates/agent.yml b/spec/dummy/.controlplane/templates/agent.yml new file mode 100644 index 00000000..162234c8 --- /dev/null +++ b/spec/dummy/.controlplane/templates/agent.yml @@ -0,0 +1,5 @@ +kind: agent +name: agent-name +description: agent description +tags: + tag1: value1