knative_spec.rb 6.93 KB
Newer Older
1 2
# frozen_string_literal: true

Chris Baumbauer's avatar
Chris Baumbauer committed
3 4 5
require 'rails_helper'

describe Clusters::Applications::Knative do
6 7 8
  include KubernetesHelpers
  include ReactiveCachingHelpers

9
  let(:knative) { create(:clusters_applications_knative) }
Chris Baumbauer's avatar
Chris Baumbauer committed
10 11

  include_examples 'cluster application core specs', :clusters_applications_knative
12
  include_examples 'cluster application status specs', :clusters_applications_knative
13
  include_examples 'cluster application helm specs', :clusters_applications_knative
14
  include_examples 'cluster application version specs', :clusters_applications_knative
15
  include_examples 'cluster application initial status specs'
Chris Baumbauer's avatar
Chris Baumbauer committed
16

17 18 19 20 21
  before do
    allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_in)
    allow(ClusterWaitForIngressIpAddressWorker).to receive(:perform_async)
  end

22 23 24 25 26 27 28
  describe 'when rbac is not enabled' do
    let(:cluster) { create(:cluster, :provided_by_gcp, :rbac_disabled) }
    let(:knative_no_rbac) { create(:clusters_applications_knative, cluster: cluster) }

    it { expect(knative_no_rbac).to be_not_installable }
  end

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
  describe 'make_installed with external_ip' do
    before do
      application.make_installed!
    end

    let(:application) { create(:clusters_applications_knative, :installing) }

    it 'schedules a ClusterWaitForIngressIpAddressWorker' do
      expect(ClusterWaitForIngressIpAddressWorker).to have_received(:perform_in)
        .with(Clusters::Applications::Knative::FETCH_IP_ADDRESS_DELAY, 'knative', application.id)
    end
  end

  describe '#schedule_status_update with external_ip' do
    let(:application) { create(:clusters_applications_knative, :installed) }

    before do
      application.schedule_status_update
    end

    it 'schedules a ClusterWaitForIngressIpAddressWorker' do
      expect(ClusterWaitForIngressIpAddressWorker).to have_received(:perform_async)
        .with('knative', application.id)
    end

    context 'when the application is not installed' do
      let(:application) { create(:clusters_applications_knative, :installing) }

      it 'does not schedule a ClusterWaitForIngressIpAddressWorker' do
        expect(ClusterWaitForIngressIpAddressWorker).not_to have_received(:perform_async)
      end
    end

    context 'when there is already an external_ip' do
      let(:application) { create(:clusters_applications_knative, :installed, external_ip: '111.222.222.111') }

      it 'does not schedule a ClusterWaitForIngressIpAddressWorker' do
        expect(ClusterWaitForIngressIpAddressWorker).not_to have_received(:perform_in)
      end
    end
69 70 71 72 73 74 75 76

    context 'when there is already an external_hostname' do
      let(:application) { create(:clusters_applications_knative, :installed, external_hostname: 'localhost.localdomain') }

      it 'does not schedule a ClusterWaitForIngressIpAddressWorker' do
        expect(ClusterWaitForIngressIpAddressWorker).not_to have_received(:perform_in)
      end
    end
77 78
  end

79
  shared_examples 'a command' do
80
    it 'is an instance of Helm::InstallCommand' do
81 82
      expect(subject).to be_an_instance_of(Gitlab::Kubernetes::Helm::InstallCommand)
    end
Chris Baumbauer's avatar
Chris Baumbauer committed
83

84
    it 'is initialized with knative arguments' do
Chris Baumbauer's avatar
Chris Baumbauer committed
85 86 87 88
      expect(subject.name).to eq('knative')
      expect(subject.chart).to eq('knative/knative')
      expect(subject.files).to eq(knative.files)
    end
89

90
    it 'does not install metrics for prometheus' do
91 92 93 94 95 96 97 98 99
      expect(subject.postinstall).to be_nil
    end

    context 'with prometheus installed' do
      let(:prometheus) { create(:clusters_applications_prometheus, :installed) }
      let(:knative) { create(:clusters_applications_knative, cluster: prometheus.cluster) }

      subject { knative.install_command }

100
      it 'installs metrics' do
101 102 103 104 105
        expect(subject.postinstall).not_to be_nil
        expect(subject.postinstall.length).to be(1)
        expect(subject.postinstall[0]).to eql("kubectl apply -f #{Clusters::Applications::Knative::METRICS_CONFIG}")
      end
    end
Chris Baumbauer's avatar
Chris Baumbauer committed
106 107
  end

108 109 110
  describe '#install_command' do
    subject { knative.install_command }

111
    it 'is initialized with latest version' do
112
      expect(subject.version).to eq('0.5.0')
113 114 115 116 117 118 119 120 121
    end

    it_behaves_like 'a command'
  end

  describe '#update_command' do
    let!(:current_installed_version) { knative.version = '0.1.0' }
    subject { knative.update_command }

122
    it 'is initialized with current version' do
123 124 125 126 127 128
      expect(subject.version).to eq(current_installed_version)
    end

    it_behaves_like 'a command'
  end

Chris Baumbauer's avatar
Chris Baumbauer committed
129 130 131 132 133 134
  describe '#files' do
    let(:application) { knative }
    let(:values) { subject[:'values.yaml'] }

    subject { application.files }

135
    it 'includes knative specific keys in the values.yaml file' do
Chris Baumbauer's avatar
Chris Baumbauer committed
136 137 138
      expect(values).to include('domain')
    end
  end
139 140 141 142

  describe 'validations' do
    it { is_expected.to validate_presence_of(:hostname) }
  end
143

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
  describe '#service_pod_details' do
    let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
    let(:service) { cluster.platform_kubernetes }
    let(:knative) { create(:clusters_applications_knative, cluster: cluster) }

    let(:namespace) do
      create(:cluster_kubernetes_namespace,
        cluster: cluster,
        cluster_project: cluster.cluster_project,
        project: cluster.cluster_project.project)
    end

    before do
      stub_kubeclient_discover(service.api_url)
      stub_kubeclient_knative_services
      stub_kubeclient_service_pods
      stub_reactive_cache(knative,
        {
          services: kube_response(kube_knative_services_body),
          pods: kube_response(kube_knative_pods_body(cluster.cluster_project.project.name, namespace.namespace))
        })
      synchronous_reactive_cache(knative)
    end

168
    it 'is able k8s core for pod details' do
169 170 171 172
      expect(knative.service_pod_details(namespace.namespace, cluster.cluster_project.project.name)).not_to be_nil
    end
  end

173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
  describe '#services' do
    let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
    let(:service) { cluster.platform_kubernetes }
    let(:knative) { create(:clusters_applications_knative, cluster: cluster) }

    let(:namespace) do
      create(:cluster_kubernetes_namespace,
        cluster: cluster,
        cluster_project: cluster.cluster_project,
        project: cluster.cluster_project.project)
    end

    subject { knative.services }

    before do
      stub_kubeclient_discover(service.api_url)
      stub_kubeclient_knative_services
190
      stub_kubeclient_service_pods
191 192
    end

193
    it 'has an unintialized cache' do
194 195 196 197 198
      is_expected.to be_nil
    end

    context 'when using synchronous reactive cache' do
      before do
199 200 201 202 203
        stub_reactive_cache(knative,
          {
            services: kube_response(kube_knative_services_body),
            pods: kube_response(kube_knative_pods_body(cluster.cluster_project.project.name, namespace.namespace))
          })
204 205 206
        synchronous_reactive_cache(knative)
      end

207
      it 'has cached services' do
208 209 210
        is_expected.not_to be_nil
      end

211
      it 'matches our namespace' do
212 213 214 215
        expect(knative.services_for(ns: namespace)).not_to be_nil
      end
    end
  end
Chris Baumbauer's avatar
Chris Baumbauer committed
216
end