# frozen_string_literal: truerequire'securerandom'require'net/http'require'uri'require'forwardable'require'openssl'moduleGitlabmoduleQAmoduleComponentclassGitlab<BaseextendForwardableattr_reader:release,:omnibus_configurationattr_accessor:tls,:skip_availability_check,:runner_networkattr_writer:name,:relative_pathdef_delegators:release,:tag,:image,:editionAUTHORITY_CERTIFICATES_PATH=File.expand_path('../../../../tls_certificates/authority',__dir__)GITLAB_CERTIFICATES_PATH=File.expand_path('../../../../tls_certificates/gitlab',__dir__)GITALY_CERTIFICATES_PATH=File.expand_path('../../../../tls_certificates/gitaly',__dir__)SSL_PATH='/etc/gitlab/ssl'TRUSTED_PATH='/etc/gitlab/trusted-certs'definitializesuper@skip_availability_check=false@volumes[GITLAB_CERTIFICATES_PATH]=SSL_PATH@volumes[AUTHORITY_CERTIFICATES_PATH]=TRUSTED_PATH@omnibus_configuration||=OmnibusConfiguration.newself.release='CE'enddefset_formless_login_tokenreturnifRuntime::Env.gitlab_qa_formless_login_token.to_s.strip.empty?@omnibus_configuration<<"gitlab_rails['env'] = { 'GITLAB_QA_FORMLESS_LOGIN_TOKEN' => '#{Runtime::Env.gitlab_qa_formless_login_token}' }"enddefelastic_url=(url)@environment['ELASTIC_URL']=urlenddefrelease=(release)@release=QA::Release.new(release)enddefname@name||="gitlab-#{edition}-#{SecureRandom.hex(4)}"enddefaddress"#{scheme}://#{hostname}#{relative_path}"enddefschemetls?'https':'http'enddefporttls?'443':'80'enddefgitaly_tls@volumes.delete(GITLAB_CERTIFICATES_PATH)@volumes[GITALY_CERTIFICATES_PATH]=SSL_PATHenddefrelative_path@relative_path||=''enddefset_accept_insecure_certsRuntime::Env.accept_insecure_certs='true'enddefprepareprepare_gitlab_omnibus_configsuperenddefpulldocker.login(**release.login_params)ifrelease.login_paramssuperenddefprepare_gitlab_omnibus_configset_formless_login_tokenenddefstart# rubocop:disable Metrics/AbcSizeensure_configured!docker.run(image,tag)do|command|command<<"-d -p #{port}"command<<"--name #{name}"command<<"--net #{network}"command<<"--hostname #{hostname}"@volumes.to_h.eachdo|to,from|command.volume(to,from,'Z')endcommand.volume(File.join(Runtime::Env.host_artifacts_dir,name,'logs'),'/var/log/gitlab','Z')@environment.to_h.eachdo|key,value|command.env(key,value)end@network_aliases.to_a.eachdo|network_alias|command<<"--network-alias #{network_alias}"endendDocker::Command.execute("network connect --alias #{name}.#{network} --alias #{name}.#{runner_network}#{runner_network}#{name}")ifrunner_networkenddefreconfiguresetup_omnibus@docker.attach(name)do|line,wait|putsline# TODO, workaround which allows to detach from the container#breakifline=~/gitlab Reconfigured!/endenddefwait_until_readyreturnifskip_availability_checkifAvailability.new(name,relative_path: relative_path,scheme: scheme,protocol_port: port.to_i).check(Runtime::Env.gitlab_availability_timeout)sleep12# TODO, handle that betterputs' -> GitLab is available.'elseabort' -> GitLab unavailable!'endenddefsha_versionjson=@docker.read_file(@release.image,@release.tag,'/opt/gitlab/version-manifest.json')manifest=JSON.parse(json)manifest['software']['gitlab-rails']['locked_version']endprivatedefensure_configured!raise'Please configure an instance first!'unless[name,release,network].all?enddefsetup_omnibus@docker.write_files(name)do|f|f.write('/etc/gitlab/gitlab.rb',@omnibus_configuration.to_s)endendclassAvailabilitydefinitialize(name,relative_path: '',scheme: 'http',protocol_port: 80)@docker=Docker::Engine.newhost=@docker.hostnameport=@docker.port(name,protocol_port).split(':').last@uri=URI.join("#{scheme}://#{host}:#{port}","#{relative_path}/",'help')enddefcheck(retries)print"Waiting for GitLab at `#{@uri}` to become available "retries.timesdoreturntrueifservice_available?print'.'sleep1endfalseendprivatedefservice_available?response=Net::HTTP.start(@uri.host,@uri.port,opts)do|http|http.head2(@uri.request_uri)endresponse.code.to_i==200rescueErrno::ECONNREFUSED,Errno::ECONNRESET,EOFErrorfalseenddefopts@uri.scheme=='https'?{use_ssl: true,verify_mode: OpenSSL::SSL::VERIFY_NONE}:{}endendclassOmnibusConfigurationdefinitialize@config=Runtime::Scenario.attributes[:omnibus_configuration]||[]enddef<<(configuration)@config<<configurationenddefto_s@config.to_sendendendendendend