Class: Bindan::Emulator::GcsServerController

Inherits:
Object
  • Object
show all
Defined in:
lib/bindan/emulators/gcs_server_controller.rb

Defined Under Namespace

Classes: ContainerCannotOpenError

Constant Summary collapse

CONTAINER_NAME =
"gcs-server"
WAIT_TIMEOUT =

seconds

15
INITIAL_BACKOFF_KEY_SEC =

seconds

0.1
BACKOFF_MULTIPLIER =
1.5

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name:, folder:) ⇒ GcsServerController

Returns a new instance of GcsServerController.

Parameters:

  • name (String)
  • folder (String)


69
70
71
72
# File 'lib/bindan/emulators/gcs_server_controller.rb', line 69

def initialize(name:, folder:)
  @container_name = name
  @folder = folder
end

Class Method Details

.running?(name:) ⇒ bool

Parameters:

  • name (String)

Returns:

  • (bool)

Raises:

  • (IOError)


42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/bindan/emulators/gcs_server_controller.rb', line 42

def running?(name:)
  _stdin, stdout, stderr, = Open3.popen3("docker container list -f name=#{name}")

  begin
    # container list not only headers
    stdout.readlines.size > 1
  rescue IOError => e
    warn "in #{self}"
    warn "   " + stderr.read
    raise ContainerCannotOpenError.new e
  end
end

.start(folder:, port: 4443, name: CONTAINER_NAME, close_io: true) ⇒ GcsServerController

Parameters:

  • folder (String)
  • [port] (Integer)
  • [name] (String)

Returns:

Raises:

  • (Errno)


24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/bindan/emulators/gcs_server_controller.rb', line 24

def start(folder:, port: 4443, name: CONTAINER_NAME, close_io: true)
  FileUtils.mkdir_p(folder)
  unless running?(name: name)
    opts = close_io ? {out: "/dev/null", err: "/dev/null"} : {}
    Process.spawn( # steep:ignore
      *"docker run --rm --name #{name} -p #{port}:4443 -v #{folder}:/data fsouza/fake-gcs-server -scheme http".split(" "),
      **opts
    )
  end

  new(name: name, folder: folder)
end

.stop(name:) ⇒ void

This method returns an undefined value.

Parameters:

  • name (String)

Raises:

  • (Errno)


60
61
62
# File 'lib/bindan/emulators/gcs_server_controller.rb', line 60

def stop(name:)
  `docker container stop #{name}`
end

Instance Method Details

#running? ⇒ bool

Parameters:

  • name (String)

Returns:

  • (bool)


85
86
87
# File 'lib/bindan/emulators/gcs_server_controller.rb', line 85

def running?
  self.class.running?(name: @container_name)
end

#stop ⇒ Object

Returns:



77
78
79
# File 'lib/bindan/emulators/gcs_server_controller.rb', line 77

def stop
  self.class.stop(name: @container_name)
end

#wait_available(timeout: WAIT_TIMEOUT, backoff: INITIAL_BACKOFF_KEY_SEC, multiplier: BACKOFF_MULTIPLIER) ⇒ void

This method returns an undefined value.

waits container to be running

Parameters:

  • timeout (number) (defaults to: WAIT_TIMEOUT)
  • backoff (number) (defaults to: INITIAL_BACKOFF_KEY_SEC)
  • multiplier (number) (defaults to: BACKOFF_MULTIPLIER)

Raises:



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/bindan/emulators/gcs_server_controller.rb', line 98

def wait_available(timeout: WAIT_TIMEOUT, backoff: INITIAL_BACKOFF_KEY_SEC, multiplier: BACKOFF_MULTIPLIER)
  last_rescued_error = nil

  count = 1
  Timeout.timeout(timeout) do
    loop do
      if running?
        return
      end
    rescue ContainerCannotOpenError => e
      last_rescued_error = e
      sleep backoff
      count += 1
      backoff *= multiplier**count
    end
  end
rescue Timeout::Error
  raise last_rescued_error # steep:ignore
end