diff --git a/app/models/gcp/cluster.rb b/app/models/gcp/cluster.rb index 21eab9d8c1cfa9d690b30746939591daf0de078d..367e9be578ceca4da8090b0d1eb02c31d42a8c03 100644 --- a/app/models/gcp/cluster.rb +++ b/app/models/gcp/cluster.rb @@ -84,7 +84,7 @@ module Gcp cluster.gcp_operation_id = nil end - before_transition any => [:errored] do |cluster| + before_transition any => [:errored] do |cluster, transition| status_reason = transition.args.first cluster.status_reason = status_reason end diff --git a/spec/factories/gcp/cluster.rb b/spec/factories/gcp/cluster.rb new file mode 100644 index 0000000000000000000000000000000000000000..ea42c71664967a90f59b1074ede6f3d841b361ec --- /dev/null +++ b/spec/factories/gcp/cluster.rb @@ -0,0 +1,23 @@ +FactoryGirl.define do + factory :gcp_cluster, class: Gcp::Cluster do + project + user + enabled true + gcp_project_id 'gcp-project-12345' + gcp_cluster_name 'test-cluster' + gcp_cluster_zone 'us-central1-a' + gcp_cluster_size 1 + + trait :with_kubernetes_service do + service :kubernetes_service + end + + trait :created_on_gke do + endpoint '111.111.111.111' + ca_cert 'xxxxxx' + kubernetes_token 'xxxxxx' + username 'xxxxxx' + password 'xxxxxx' + end + end +end diff --git a/spec/models/gcp/cluster_spec.rb b/spec/models/gcp/cluster_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..5e4c35e24ffe7947256614abe9b0f93555963f4e --- /dev/null +++ b/spec/models/gcp/cluster_spec.rb @@ -0,0 +1,266 @@ +require 'spec_helper' + +describe Gcp::Cluster do + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:user) } + it { is_expected.to belong_to(:service) } + + it { is_expected.to validate_presence_of(:gcp_cluster_zone) } + + describe '#default_value_for' do + let(:cluster) { described_class.new } + + it { expect(cluster.gcp_cluster_zone).to eq('us-central1-a') } + it { expect(cluster.gcp_cluster_size).to eq(3) } + it { expect(cluster.gcp_machine_type).to eq('n1-standard-4') } + end + + describe '#validates' do + subject { cluster.valid? } + + context 'when validates gcp_project_id' do + let(:cluster) { build(:gcp_cluster, gcp_project_id: gcp_project_id) } + + context 'when valid' do + let(:gcp_project_id) { 'gcp-project-12345' } + + it { is_expected.to be_truthy } + end + + context 'when empty' do + let(:gcp_project_id) { '' } + + it { is_expected.to be_falsey } + end + + context 'when too long' do + let(:gcp_project_id) { 'A'*64 } + + it { is_expected.to be_falsey } + end + + context 'when includes abnormal character' do + let(:gcp_project_id) { '!!!!!!' } + + it { is_expected.to be_falsey } + end + end + + context 'when validates gcp_cluster_name' do + let(:cluster) { build(:gcp_cluster, gcp_cluster_name: gcp_cluster_name) } + + context 'when valid' do + let(:gcp_cluster_name) { 'test-cluster' } + + it { is_expected.to be_truthy } + end + + context 'when empty' do + let(:gcp_cluster_name) { '' } + + it { is_expected.to be_falsey } + end + + context 'when too long' do + let(:gcp_cluster_name) { 'A'*64 } + + it { is_expected.to be_falsey } + end + + context 'when includes abnormal character' do + let(:gcp_cluster_name) { '!!!!!!' } + + it { is_expected.to be_falsey } + end + end + + context 'when validates gcp_cluster_size' do + let(:cluster) { build(:gcp_cluster, gcp_cluster_size: gcp_cluster_size) } + + context 'when valid' do + let(:gcp_cluster_size) { 1 } + + it { is_expected.to be_truthy } + end + + context 'when zero' do + let(:gcp_cluster_size) { 0 } + + it { is_expected.to be_falsey } + end + end + + context 'when validates project_namespace' do + let(:cluster) { build(:gcp_cluster, project_namespace: project_namespace) } + + context 'when valid' do + let(:project_namespace) { 'default-namespace' } + + it { is_expected.to be_truthy } + end + + context 'when empty' do + let(:project_namespace) { '' } + + it { is_expected.to be_truthy } + end + + context 'when too long' do + let(:project_namespace) { 'A'*64 } + + it { is_expected.to be_falsey } + end + + context 'when includes abnormal character' do + let(:project_namespace) { '!!!!!!' } + + it { is_expected.to be_falsey } + end + end + + context 'when validates restrict_modification' do + let(:cluster) { create(:gcp_cluster) } + + before do + cluster.creating! + end + + context 'when created' do + before do + cluster.created! + end + + it { is_expected.to be_truthy } + end + + context 'when creating' do + it { is_expected.to be_falsey } + end + end + end + + describe '#state_machine' do + let(:cluster) { build(:gcp_cluster) } + + context 'when transits to created state' do + before do + cluster.gcp_token = 'tmp' + cluster.gcp_operation_id = 'tmp' + cluster.make_created! + end + + it 'nullify gcp_token and gcp_operation_id' do + expect(cluster.gcp_token).to be_nil + expect(cluster.gcp_operation_id).to be_nil + expect(cluster).to be_created + end + end + + context 'when transits to errored state' do + let(:reason) { 'something wrong' } + + before do + cluster.make_errored!(reason) + end + + it 'sets status_reason' do + expect(cluster.status_reason).to eq(reason) + expect(cluster).to be_errored + end + end + end + + describe '#project_namespace_placeholder' do + subject { cluster.project_namespace_placeholder } + + let(:cluster) { create(:gcp_cluster) } + + it 'returns a placeholder' do + is_expected.to eq("#{cluster.project.path}-#{cluster.project.id}") + end + end + + describe '#on_creation?' do + subject { cluster.on_creation? } + + let(:cluster) { create(:gcp_cluster) } + + context 'when status is creating' do + before do + cluster.make_creating! + end + + it { is_expected.to be_truthy } + end + + context 'when status is created' do + before do + cluster.make_created! + end + + it { is_expected.to be_falsey } + end + end + + describe '#api_url' do + subject { cluster.api_url } + + let(:cluster) { create(:gcp_cluster, :created_on_gke) } + let(:api_url) { 'https://' + cluster.endpoint } + + it { is_expected.to eq(api_url) } + end + + describe '#restrict_modification' do + subject { cluster.restrict_modification } + + let(:cluster) { create(:gcp_cluster) } + + context 'when status is created' do + before do + cluster.make_created! + end + + it { is_expected.to be_truthy } + end + + context 'when status is creating' do + before do + cluster.make_creating! + end + + it { is_expected.to be_falsey } + + it 'sets error' do + is_expected.to be_falsey + expect(cluster.errors).not_to be_empty + end + end + end + + describe '#destroy' do + subject { cluster.destroy } + + let(:cluster) { create(:gcp_cluster) } + + context 'when status is created' do + before do + cluster.make_created! + end + + it 'destory the cluster' do + is_expected.to eq(cluster) + end + end + + context 'when status is creating' do + before do + cluster.make_creating! + end + + it 'does not destory the cluster' do + is_expected.to be_nil + end + end + end +end diff --git a/spec/services/ci/create_cluster_service_spec.rb b/spec/services/ci/create_cluster_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..eaa27eb4cc36fc08cbf6f2b03ae4a1d9c2ae4b59 --- /dev/null +++ b/spec/services/ci/create_cluster_service_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe Ci::CreateClusterService do + describe '#execute' do + let(:access_token) { 'xxx' } + + context 'when correct params' do + it 'creates a cluster object' do + + end + end + + context 'when invalid params' do + it 'returns an error' do + + end + end + end +end diff --git a/spec/services/ci/fetch_gcp_operation_service_spec.rb b/spec/services/ci/fetch_gcp_operation_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..13141d81ab8f37ff56a5511357d504e579fced13 --- /dev/null +++ b/spec/services/ci/fetch_gcp_operation_service_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Ci::FetchGcpOperationService do + describe '#execute' do + context 'when correct params' do + it 'fetch the gcp operaion' do + + end + end + + context 'when invalid params' do + it 'sets an error to cluster object' do + + end + end + end +end diff --git a/spec/services/ci/fetch_kubernetes_token_service_spec.rb b/spec/services/ci/fetch_kubernetes_token_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..b66b5a7947db7db8cb53fb412d84cea6023efdea --- /dev/null +++ b/spec/services/ci/fetch_kubernetes_token_service_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Ci::FetchKubernetesTokenService do + describe '#execute' do + context 'when correct params' do + it 'fetch the kubernetes token' do + + end + end + + context 'when invalid params' do + it 'returns nil' do + + end + end + end +end diff --git a/spec/services/ci/finalize_cluster_creation_service_spec.rb b/spec/services/ci/finalize_cluster_creation_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..81af15942c09de2bb7b2ab141965a9e96bc5f9bf --- /dev/null +++ b/spec/services/ci/finalize_cluster_creation_service_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Ci::FinalizeClusterCreationService do + describe '#execute' do + context 'when correct params' do + it 'execute IntegrateClusterService' do + + end + end + + context 'when invalid params' do + it 'returns a cluster object with error' do + + end + end + end +end diff --git a/spec/services/ci/integrate_cluster_service_spec.rb b/spec/services/ci/integrate_cluster_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..7a8c80ca4e737c5c8ad72e1e43064cfa26a891f2 --- /dev/null +++ b/spec/services/ci/integrate_cluster_service_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Ci::IntegrateClusterService do + describe '#execute' do + context 'when correct params' do + it 'creates a cluster object' do + + end + end + + context 'when invalid params' do + it 'returns a cluster object with error' do + + end + end + end +end diff --git a/spec/services/ci/provision_cluster_service_spec.rb b/spec/services/ci/provision_cluster_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..d1595c8917d9ae2bc3064b8c46fe774a04af0a76 --- /dev/null +++ b/spec/services/ci/provision_cluster_service_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Ci::ProvisionClusterService do + describe '#execute' do + context 'when correct params' do + it 'creates a cluster on gke' do + + end + end + + context 'when invalid params' do + it 'returns a cluster object with error' do + + end + end + end +end diff --git a/spec/services/ci/update_cluster_service_spec.rb b/spec/services/ci/update_cluster_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..afe3d418a8e455bdaa270f9b0250381373689ff8 --- /dev/null +++ b/spec/services/ci/update_cluster_service_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Ci::UpdateClusterService do + describe '#execute' do + context 'when correct params' do + it 'updates the cluster and the service' do + + end + end + + context 'when invalid params' do + it 'returns a cluster object with error' do + + end + end + end +end