Class: Pgai::CreateCloneService

Inherits:
Object
  • Object
show all
Defined in:
lib/pgai/create_clone_service.rb

Constant Summary collapse

HOSTNAME =
"127.0.0.1"
CLONE_REFRESH_INTERVAL =
0.2

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id, env:, logger:) ⇒ CreateCloneService

Returns a new instance of CreateCloneService.



12
13
14
15
16
# File 'lib/pgai/create_clone_service.rb', line 12

def initialize(id, env:, logger:)
  @id = id
  @env = env
  @logger = logger
end

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



10
11
12
# File 'lib/pgai/create_clone_service.rb', line 10

def env
  @env
end

#idObject (readonly)

Returns the value of attribute id.



10
11
12
# File 'lib/pgai/create_clone_service.rb', line 10

def id
  @id
end

#loggerObject (readonly)

Returns the value of attribute logger.



10
11
12
# File 'lib/pgai/create_clone_service.rb', line 10

def logger
  @logger
end

Instance Method Details

#cached_clone_attributesObject



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/pgai/create_clone_service.rb', line 36

def cached_clone_attributes
  {
    id: id,
    port: clone_resource.db_object.port,
    password: clone_resource.db_object.password,
    user: clone_resource.db_object.username,
    host: HOSTNAME,
    remote_host: env.id,
    dbname: env.dbname,
    created_at: clone_resource.created_at,
    data_state_at: clone_resource.snapshot.data_state_at
  }
end

#clone_resourceObject



50
51
52
# File 'lib/pgai/create_clone_service.rb', line 50

def clone_resource
  @clone_resource ||= create_clone_resource
end

#create_clone_resourceObject



28
29
30
31
32
33
34
# File 'lib/pgai/create_clone_service.rb', line 28

def create_clone_resource
  @clone_resource = Resources::Remote::Clone.new(id: id).tap do |resource|
    resource.db_object = Resources::Remote::DbObject.new(db_name: env.dbname)
    resource.snapshot = Resources::Remote::Snapshot.latest
    resource.save
  end
end

#executeObject



18
19
20
21
22
23
24
25
26
# File 'lib/pgai/create_clone_service.rb', line 18

def execute
  create_clone_resource
  logger.debug(clone_resource.status_message)
  progress_bar.advance
  wait_for_clone_to_be_ready
  logger.debug(clone_resource.status_message)

  Resources::Local::Clone.new(cached_clone_attributes).tap(&:save)
end

#progress_barObject



64
65
66
67
68
69
# File 'lib/pgai/create_clone_service.rb', line 64

def progress_bar
  @progress_bar ||= TTY::ProgressBar.new(
    "Preparing clone ... [:bar]",
    total: progress_bar_steps
  )
end

#progress_bar_stepsObject



71
72
73
# File 'lib/pgai/create_clone_service.rb', line 71

def progress_bar_steps
  (env.expected_cloning_time / CLONE_REFRESH_INTERVAL).ceil + 1
end

#wait_for_clone_to_be_readyObject



54
55
56
57
58
59
60
61
62
# File 'lib/pgai/create_clone_service.rb', line 54

def wait_for_clone_to_be_ready
  loop do
    clone_resource.refresh
    progress_bar.advance
    break if clone_resource.ready?
    sleep(CLONE_REFRESH_INTERVAL)
  end
  progress_bar.finish
end