github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/tests/system/lib/stack.rb (about) 1 class Stack 2 ALERT_ADDR = "alert@spam.cozycloud.cc".freeze 3 4 class StackError < StandardError 5 def message 6 "Stack is not available" 7 end 8 end 9 10 attr_reader :port, :oauth_client_id 11 12 @stacks = {} 13 @next_port = ENV.fetch("COZY_BASE_PORT", 8080).to_i 14 15 def self.get(port = nil) 16 port ||= (@next_port += 1) 17 @stacks[port] ||= Stack.new(port) 18 end 19 20 def self.cat_logs 21 @stacks.each do |_port, stack| 22 Helpers.cat "stack-#{stack.port}.log" 23 end 24 end 25 26 def initialize(port) 27 @port = port 28 @admin = port - 2020 29 @oauth_client_id = nil 30 @apps = {} 31 @tokens = {} 32 end 33 34 def konnectors_cmd 35 File.expand_path "../../../scripts/konnector-node-run.sh", __dir__ 36 end 37 38 def start 39 vault = File.join Helpers.current_dir, "vault" 40 FileUtils.mkdir_p vault 41 fsurl = "file://#{Helpers.current_dir}/" 42 if ENV["COZY_SWIFTTEST"] 43 fsurl = "'swift://127.0.0.1:6006/v1.0?UserName=swifttest&Password=swifttest&AuthURL=http://127.0.0.1:6006/v1.0'" 44 end 45 system("cozy-stack config gen-keys '#{vault}/key'") unless File.exist?("#{vault}/key.enc") 46 cmd = ["cozy-stack", "serve", "--log-level", "debug", 47 "--mailhog", 48 "--port", @port, "--admin-port", @admin, 49 "--fs-url", fsurl, 50 "--vault-encryptor-key", "#{vault}/key.enc", 51 "--vault-decryptor-key", "#{vault}/key.dec", 52 "--mail-alert-address", ALERT_ADDR, 53 "--onlyoffice-url", "https://documentserver.example.net", 54 "--konnectors-cmd", konnectors_cmd] 55 Helpers.spawn cmd.join(" "), log: "stack-#{@port}.log" 56 sleep 1 57 end 58 59 def create_instance(inst) 60 cmd = ["cozy-stack", "instances", "add", inst.domain, 61 "--public-name", inst.name, "--email", inst.email, 62 "--settings", "context:test", "--locale", inst.locale, 63 "--admin-port", @admin] 64 cmd << "--passphrase" << inst.passphrase if inst.passphrase 65 puts cmd.join(" ").green 66 return if system(cmd.join(" ")) 67 68 # Try again if the cozy-stack serve was too slow to listen 69 sleep 5 70 return if system(cmd.join(" ")) 71 72 raise StackError.new 73 end 74 75 def remove_instance(inst) 76 cmd = ["cozy-stack", "instances", "rm", "--force", inst.domain, 77 "--admin-port", @admin] 78 puts cmd.join(" ").green 79 system cmd.join(" ") 80 end 81 82 def install_app(inst, app) 83 key = inst.domain + "/" + app 84 return if @apps[key] 85 cmd = ["cozy-stack", "apps", "install", app, 86 "--port", @port, "--admin-port", @admin, 87 "--domain", inst.domain, ">", "/dev/null"] 88 puts cmd.join(" ").green 89 @apps[key] = system cmd.join(" ") 90 end 91 92 def install_konnector(inst, slug, source_url = nil) 93 cmd = ["cozy-stack", "konnectors", "install", 94 slug, source_url, 95 "--port", @port, "--admin-port", @admin, 96 "--domain", inst.domain, ">", "/dev/null"].compact 97 puts cmd.join(" ").green 98 system cmd.join(" ") 99 end 100 101 def remove_konnector(inst, slug) 102 cmd = ["cozy-stack", "konnectors", "uninstall", slug, 103 "--port", @port, "--admin-port", @admin, 104 "--domain", inst.domain, ">", "/dev/null"] 105 puts cmd.join(" ").green 106 system cmd.join(" ") 107 end 108 109 def run_konnector(inst, slug, account_id) 110 cmd = ["cozy-stack", "konnectors", "run", slug, 111 "--account-id", account_id, 112 "--port", @port, "--admin-port", @admin, 113 "--domain", inst.domain] 114 puts cmd.join(" ").green 115 out = `#{cmd.join(" ")}`.chomp 116 Job.new JSON.parse(out) 117 end 118 119 def run_job(inst, type, args) 120 cmd = ["cozy-stack", "jobs", "run", type, 121 "--json", "'#{JSON.generate(args)}'", 122 "--port", @port, "--admin-port", @admin, 123 "--domain", inst.domain] 124 puts cmd.join(" ").green 125 out = `#{cmd.join(" ")}`.chomp 126 Job.new JSON.parse(out) 127 end 128 129 def setup_2fa(inst) 130 cmd = ["cozy-stack", "instance", "auth-mode", 131 inst.domain, "two_factor_mail", 132 "--port", @port, "--admin-port", @admin] 133 puts cmd.join(" ").green 134 system cmd.join(" ") 135 end 136 137 def token_for(inst, doctypes) 138 key = inst.domain + "/" + doctypes.join(" ") 139 @tokens[key] ||= generate_token_for(inst, doctypes) 140 end 141 142 def reset_tokens 143 @oauth_client_id = nil 144 @tokens = {} 145 end 146 147 def generate_token_for(inst, doctypes) 148 @oauth_client_id ||= generate_client_id(inst) 149 cmd = ["cozy-stack", "instances", "token-oauth", inst.domain, 150 "--admin-port", @admin, 151 @oauth_client_id, "'#{doctypes.join(' ')}'"] 152 puts cmd.join(" ").green 153 `#{cmd.join(" ")}`.chomp 154 end 155 156 def generate_client_id(inst) 157 cmd = ["cozy-stack", "instances", "client-oauth", inst.domain, 158 "--admin-port", @admin, 159 "http://localhost", "test-sharing", "github.com/cozy/cozy-stack/tests/system"] 160 puts cmd.join(" ").green 161 `#{cmd.join(" ")}`.chomp 162 end 163 164 def fsck(inst) 165 cmd = ["cozy-stack", "check", "fs", inst.domain, 166 "--admin-port", @admin] 167 puts cmd.join(" ").green 168 `#{cmd.join(" ")}`.chomp.lines 169 end 170 171 def check_shared(inst) 172 cmd = ["cozy-stack", "check", "shared", inst.domain, 173 "--admin-port", @admin] 174 puts cmd.join(" ").green 175 `#{cmd.join(" ")}`.chomp.lines 176 end 177 178 def grep_dumb_file_pather_logs 179 logfile = "#{Helpers.current_dir}/stack-#{@port}.log" 180 cmd = ["grep", "DumbFilePather", logfile] 181 puts cmd.join(" ").green 182 `#{cmd.join(" ")}`.chomp.lines 183 end 184 185 def pending_clients(inst) 186 clients = Helpers.couch.all_docs inst.domain, "io.cozy.oauth.clients" 187 clients.select { |c| c["pending"] } 188 end 189 190 def check(inst) 191 [fsck(inst), check_shared(inst), pending_clients(inst), grep_dumb_file_pather_logs].flatten 192 end 193 end