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
PROGRESS_BAR_WIDTH =
80

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of CreateCloneService.



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

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

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



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

def env
  @env
end

#idObject (readonly)

Returns the value of attribute id.



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

def id
  @id
end

#loggerObject (readonly)

Returns the value of attribute logger.



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

def logger
  @logger
end

Instance Method Details

#cached_clone_attributesObject



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/pgai/create_clone_service.rb', line 41

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



55
56
57
# File 'lib/pgai/create_clone_service.rb', line 55

def clone_resource
  @clone_resource ||= create_clone_resource
end

#create_clone_resourceObject



33
34
35
36
37
38
39
# File 'lib/pgai/create_clone_service.rb', line 33

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



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/pgai/create_clone_service.rb', line 19

def execute
  logger.info("Preparing clone ...")
  logger.debug { "Expected cloning time: #{env.expected_cloning_time}" }
  progress_bar.start

  create_clone_resource

  logger.debug { clone_resource.status_message }
  wait_for_clone_to_be_ready
  logger.debug { clone_resource.status_message }

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

#progress_barObject



69
70
71
# File 'lib/pgai/create_clone_service.rb', line 69

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

#stepsObject



73
74
75
# File 'lib/pgai/create_clone_service.rb', line 73

def steps
  @steps ||= (PROGRESS_BAR_WIDTH / env.expected_cloning_time).ceil
end

#wait_for_clone_to_be_readyObject



59
60
61
62
63
64
65
66
67
# File 'lib/pgai/create_clone_service.rb', line 59

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