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