Add missing libraries
This commit is contained in:
parent
6d9a6078b3
commit
8d31a7a69c
15 changed files with 485 additions and 0 deletions
26
src/lib/actions.cr
Normal file
26
src/lib/actions.cr
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
require "tablo"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
class Action
|
||||||
|
def initialize(_config : ConfigModel, _options : ActionOptions)
|
||||||
|
# Do nothing by default
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
def perform
|
||||||
|
# Do nothing by default
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class ActionFactory
|
||||||
|
def self.build(action_type : Action.class, config, options)
|
||||||
|
action = action_type.new(config, options)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
require "./actions/*"
|
||||||
|
|
||||||
|
|
91
src/lib/actions/apply.cr
Normal file
91
src/lib/actions/apply.cr
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
|
||||||
|
require "../openstack"
|
||||||
|
require "../actions"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
class ApplyAction < Action
|
||||||
|
def initialize(config : ConfigModel, options : ActionOptions)
|
||||||
|
puts "action = Apply"
|
||||||
|
@config = config
|
||||||
|
end
|
||||||
|
|
||||||
|
# First create today's backup
|
||||||
|
# Then remove old backups
|
||||||
|
def perform
|
||||||
|
_create_backup_all
|
||||||
|
_delete_backup_all
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
def _create_backup_all
|
||||||
|
puts "_create_backup_all".colorize(:yellow)
|
||||||
|
os_volumes = OpenStack.volume_list
|
||||||
|
|
||||||
|
@config.targets.each do |config_volume_item|
|
||||||
|
os_volume_item =
|
||||||
|
os_volumes.select {|vol| vol.id == config_volume_item.volume_id }.first
|
||||||
|
|
||||||
|
if os_volume_item.nil?
|
||||||
|
puts " ERROR: no volume found with this id".colorize(:red)
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
_create_backup(config_volume_item, os_volume_item)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def _create_backup(config_item : TargetItemModel, volume_item : OSVolume::ListItemModel)
|
||||||
|
puts "_create_backup".colorize(:yellow)
|
||||||
|
puts "+ openstack volume snapshot #{config_item.name.colorize(:yellow)} {"
|
||||||
|
puts "+ volume_id #{config_item.volume_id}"
|
||||||
|
puts "+ name #{volume_item.name}"
|
||||||
|
puts "+ size #{volume_item.size}"
|
||||||
|
puts "+ }"
|
||||||
|
|
||||||
|
created_volume = OpenStack.volume_snapshot_create(volume_item, config_item.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def _delete_backup_all
|
||||||
|
puts "_delete_backup_all".colorize(:yellow)
|
||||||
|
os_volumes = OpenStack.volume_list
|
||||||
|
os_all_snapshots = OpenStack.volume_snapshot_list
|
||||||
|
|
||||||
|
@config.targets.each do |config_volume_item|
|
||||||
|
os_volume_item = os_volumes.select {|vol|
|
||||||
|
vol.id == config_volume_item.volume_id
|
||||||
|
}.try &.first
|
||||||
|
|
||||||
|
os_volume_snapshots = os_all_snapshots.select {|snap|
|
||||||
|
snap.volume == config_volume_item.volume_id
|
||||||
|
}
|
||||||
|
|
||||||
|
os_volume_snapshots.each do |snap_item|
|
||||||
|
_delete_backup(config_volume_item, snap_item)
|
||||||
|
pp snap_item
|
||||||
|
end
|
||||||
|
|
||||||
|
# _delete_backup(config_volume_item, os_volume_snapshot_item)
|
||||||
|
# volume_snapshots.each do |target_snapshot|
|
||||||
|
# os_volume_item =
|
||||||
|
# os_volumes.select {|vol| vol.id == config_volume_item.volume_id }.first
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def _delete_backup(config_item : TargetItemModel, snap_item : OSVolume::SnapshotListItemModel)
|
||||||
|
puts "_delete_backup".colorize(:yellow)
|
||||||
|
|
||||||
|
puts "- openstack volume snapshot #{config_item.name.colorize(:yellow)} {"
|
||||||
|
puts "- volume_id #{config_item.volume_id}"
|
||||||
|
puts "- created_at #{snap_item.created_at}"
|
||||||
|
puts "- snap_id #{snap_item.id}"
|
||||||
|
puts "- name #{snap_item.name}"
|
||||||
|
puts "- size #{snap_item.size}"
|
||||||
|
puts "- }"
|
||||||
|
|
||||||
|
pp config_item
|
||||||
|
pp snap_item
|
||||||
|
|
||||||
|
# FIXME: not implemented
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
17
src/lib/actions/none.cr
Normal file
17
src/lib/actions/none.cr
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
require "../actions"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
class NoneAction < Action
|
||||||
|
def initialize(config : ConfigModel, options : ActionOptions)
|
||||||
|
puts "action = None"
|
||||||
|
# @global_options = global_options
|
||||||
|
# @config = config
|
||||||
|
end
|
||||||
|
|
||||||
|
def perform
|
||||||
|
# Do nothing by default
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
21
src/lib/actions/plan.cr
Normal file
21
src/lib/actions/plan.cr
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
require "../actions"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
class PlanAction < Action
|
||||||
|
def initialize(config : ConfigModel, options : ActionOptions)
|
||||||
|
@config = config
|
||||||
|
puts "action = Plan"
|
||||||
|
end
|
||||||
|
|
||||||
|
def perform
|
||||||
|
@config.targets.each do |target|
|
||||||
|
puts "#{target.name}"
|
||||||
|
puts "- volume_id #{target.volume_id}"
|
||||||
|
# puts "- snapshot_prefix #{target.snapshot_prefix}"
|
||||||
|
puts ""
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
11
src/lib/models.cr
Normal file
11
src/lib/models.cr
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
require "yaml"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
class Model
|
||||||
|
include YAML::Serializable
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
require "./types"
|
||||||
|
require "./models/*"
|
11
src/lib/models/config.cr
Normal file
11
src/lib/models/config.cr
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
require "../models"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
class ConfigModel < Model
|
||||||
|
property version : String
|
||||||
|
property retention : RetentionModel
|
||||||
|
property targets : Array(TargetItemModel)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
74
src/lib/models/os_vol_list_item.cr
Normal file
74
src/lib/models/os_vol_list_item.cr
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
|
||||||
|
|
||||||
|
# - Attached to: []
|
||||||
|
# ID: 8c87c196-1dd6-4190-bff5-00b543965093
|
||||||
|
# Name: ovh-managed-kubernetes-e6j07m-pvc-9fad19b4-b32c-452a-9893-524fcdc3a4b1
|
||||||
|
# Size: 50
|
||||||
|
# Status: available
|
||||||
|
# - Attached to:
|
||||||
|
# - attached_at: '2022-06-27T17:38:53.000000'
|
||||||
|
# attachment_id: 88a7dfc4-5bdf-4864-b38d-c82169c37b9d
|
||||||
|
# device: /dev/sdc
|
||||||
|
# host_name: null
|
||||||
|
# id: c9b11fcb-a6a4-4387-b55b-34121f97dac4
|
||||||
|
# server_id: 37220c33-19e7-45cc-9c6a-ddf957be3c76
|
||||||
|
# volume_id: c9b11fcb-a6a4-4387-b55b-34121f97dac4
|
||||||
|
# ID: c9b11fcb-a6a4-4387-b55b-34121f97dac4
|
||||||
|
# Name: ovh-managed-kubernetes-e6j07m-pvc-13dcac68-71c9-4794-b0ab-d48e76d843ef
|
||||||
|
# Size: 5800
|
||||||
|
# Status: in-use
|
||||||
|
|
||||||
|
## LONG
|
||||||
|
|
||||||
|
# - Attached to:
|
||||||
|
# - attached_at: '2022-06-27T17:31:53.000000'
|
||||||
|
# attachment_id: 845a7ff2-ad54-4040-b69b-fce7fdfdece2
|
||||||
|
# device: /dev/sdb
|
||||||
|
# host_name: null
|
||||||
|
# id: 6d4492e5-6b38-4ad3-b9bf-27ba86e2506b
|
||||||
|
# server_id: 37220c33-19e7-45cc-9c6a-ddf957be3c76
|
||||||
|
# volume_id: 6d4492e5-6b38-4ad3-b9bf-27ba86e2506b
|
||||||
|
# Bootable: 'false'
|
||||||
|
# ID: 6d4492e5-6b38-4ad3-b9bf-27ba86e2506b
|
||||||
|
# Name: ovh-managed-kubernetes-e6j07m-pvc-7bf995bf-ac82-4f42-94ca-78cd9c78959d
|
||||||
|
# Properties:
|
||||||
|
# attached_mode: rw
|
||||||
|
# cinder.csi.openstack.org/cluster: kubernetes
|
||||||
|
# readonly: 'False'
|
||||||
|
# Size: 1
|
||||||
|
# Status: in-use
|
||||||
|
# Type: high-speed
|
||||||
|
|
||||||
|
|
||||||
|
require "../models"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
module OSVolume
|
||||||
|
class ListItemModel < Model
|
||||||
|
@[YAML::Field(key: "Attached to")]
|
||||||
|
property attached_to : Array(OSVolume::ListItemAttachment::ListItemModel)
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Bootable")]
|
||||||
|
property bootable : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "ID")]
|
||||||
|
property id : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Name")]
|
||||||
|
property name : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Properties")]
|
||||||
|
property properties : YAML::Any
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Size")]
|
||||||
|
property size : UInt16
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Status")]
|
||||||
|
property status : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Type")]
|
||||||
|
property type : String
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
20
src/lib/models/os_vol_list_item_attach_item.cr
Normal file
20
src/lib/models/os_vol_list_item_attach_item.cr
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
require "../models"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
module OSVolume
|
||||||
|
class ListItemAttachment
|
||||||
|
class ListItemModel < Model
|
||||||
|
property attached_at : String
|
||||||
|
property attachment_id : String
|
||||||
|
property device : String
|
||||||
|
property host_name : String
|
||||||
|
property id : String
|
||||||
|
property server_id : String
|
||||||
|
property volume_id : String
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
42
src/lib/models/os_vol_snap_create_item.cr
Normal file
42
src/lib/models/os_vol_snap_create_item.cr
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
|
||||||
|
# created_at: '2022-06-28T11:26:06.266927'
|
||||||
|
# description: null
|
||||||
|
# id: 52fa0022-3ed8-43bc-90d9-08d22597fb35
|
||||||
|
# name: pouet
|
||||||
|
# properties: {}
|
||||||
|
# size: 50
|
||||||
|
# status: creating
|
||||||
|
# updated_at: null
|
||||||
|
# volume_id: de7b118f-413b-4962-a028-a742df4bc4fc
|
||||||
|
|
||||||
|
require "../models"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
module OSVolume
|
||||||
|
class SnapshotCreateItemModel < Model
|
||||||
|
@[YAML::Field(key: "created_at")]
|
||||||
|
property created_at : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "description")]
|
||||||
|
property description : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "id")]
|
||||||
|
property id : String ## UUID
|
||||||
|
|
||||||
|
@[YAML::Field(key: "name")]
|
||||||
|
property name : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "properties")]
|
||||||
|
property properties : YAML::Any
|
||||||
|
|
||||||
|
@[YAML::Field(key: "size")]
|
||||||
|
property size : UInt16
|
||||||
|
|
||||||
|
@[YAML::Field(key: "status")]
|
||||||
|
property status : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "volume_id")]
|
||||||
|
property volume_id : String
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
51
src/lib/models/os_vol_snap_list_item.cr
Normal file
51
src/lib/models/os_vol_snap_list_item.cr
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
|
||||||
|
## volume snapshot list -f yaml
|
||||||
|
|
||||||
|
# - Description: null
|
||||||
|
# ID: 86367f4d-fbc2-4e09-b0e7-1b4b73f72baa
|
||||||
|
# Name: db-snapshot01
|
||||||
|
# Size: 50
|
||||||
|
# Status: available
|
||||||
|
|
||||||
|
## volume snapshot list --long -f yaml
|
||||||
|
|
||||||
|
# - Created At: '2022-06-27T14:09:47.000000'
|
||||||
|
# Description: null
|
||||||
|
# ID: 86367f4d-fbc2-4e09-b0e7-1b4b73f72baa
|
||||||
|
# Name: db-snapshot01
|
||||||
|
# Properties: {}
|
||||||
|
# Size: 50
|
||||||
|
# Status: available
|
||||||
|
# Volume: 8c87c196-1dd6-4190-bff5-00b543965093
|
||||||
|
|
||||||
|
require "../models"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
module OSVolume
|
||||||
|
class SnapshotListItemModel < Model
|
||||||
|
@[YAML::Field(key: "Created At")]
|
||||||
|
property created_at : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Description")]
|
||||||
|
property description : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "ID")]
|
||||||
|
property id : String ## UUID
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Name")]
|
||||||
|
property name : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Properties")]
|
||||||
|
property properties : YAML::Any
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Size")]
|
||||||
|
property size : UInt16
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Status")]
|
||||||
|
property status : String
|
||||||
|
|
||||||
|
@[YAML::Field(key: "Volume")]
|
||||||
|
property volume : String
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
10
src/lib/models/retention.cr
Normal file
10
src/lib/models/retention.cr
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
require "../models"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
class RetentionModel < Model
|
||||||
|
property days : UInt8
|
||||||
|
property cycle : Bool
|
||||||
|
property max_items : UInt8
|
||||||
|
end
|
||||||
|
end
|
11
src/lib/models/target.cr
Normal file
11
src/lib/models/target.cr
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
require "../models"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
class TargetItemModel < Model
|
||||||
|
property name : String
|
||||||
|
property volume_id : String
|
||||||
|
# property snapshot_prefix : String
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
77
src/lib/openstack.cr
Normal file
77
src/lib/openstack.cr
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
class OpenStack
|
||||||
|
#
|
||||||
|
# openstack volume list
|
||||||
|
#
|
||||||
|
def self.volume_list
|
||||||
|
cmd = "openstack"
|
||||||
|
args = [
|
||||||
|
"volume", "list",
|
||||||
|
"--long",
|
||||||
|
"--format", "yaml"
|
||||||
|
]
|
||||||
|
stdout = IO::Memory.new
|
||||||
|
stderr = IO::Memory.new
|
||||||
|
|
||||||
|
status = Process.run(cmd, args: args, output: stdout, error: stderr)
|
||||||
|
if ! status.success?
|
||||||
|
raise RuntimeError.new("command failed for: #{cmd} #{args.join(" ")}") # FIXME: improve message
|
||||||
|
end
|
||||||
|
|
||||||
|
return Array(OSVolume::ListItemModel).from_yaml(stdout.to_s)
|
||||||
|
rescue ex : RuntimeError
|
||||||
|
puts "ERROR: #{ex.message}".colorize(:red)
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# openstack volume snapshot list
|
||||||
|
#
|
||||||
|
def self.volume_snapshot_list
|
||||||
|
cmd = "openstack"
|
||||||
|
args =[
|
||||||
|
"volume", "snapshot", "list",
|
||||||
|
"--long",
|
||||||
|
"--format", "yaml"
|
||||||
|
]
|
||||||
|
stdout = IO::Memory.new
|
||||||
|
stderr = IO::Memory.new
|
||||||
|
|
||||||
|
status = Process.run(cmd, args: args, output: stdout, error: stderr)
|
||||||
|
if ! status.success?
|
||||||
|
raise RuntimeError.new("command failed for: #{cmd} #{args.join(" ")}") # FIXME: improve message
|
||||||
|
end
|
||||||
|
|
||||||
|
return Array(OSVolume::SnapshotListItemModel).from_yaml(stdout.to_s)
|
||||||
|
rescue ex : RuntimeError
|
||||||
|
puts "ERROR: #{ex.message}".colorize(:red)
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# openstack volume snapshot create --volume VOLUME_ID --force SNAPSHOT_NAME -f yaml
|
||||||
|
#
|
||||||
|
def self.volume_snapshot_create(target_volume, snap_name)
|
||||||
|
cmd = "openstack"
|
||||||
|
args = ["volume", "snapshot", "create",
|
||||||
|
"--volume", target_volume.id,
|
||||||
|
"--force",
|
||||||
|
snap_name,
|
||||||
|
"--format", "yaml"]
|
||||||
|
stdout = IO::Memory.new
|
||||||
|
stderr = IO::Memory.new
|
||||||
|
|
||||||
|
status = Process.run(cmd, args: args, output: stdout, error: stderr)
|
||||||
|
if ! status.success?
|
||||||
|
raise RuntimeError.new("#{cmd} #{args.join(" ")}\n#{stderr.to_s}") # FIXME: improve message
|
||||||
|
end
|
||||||
|
|
||||||
|
return OSVolume::SnapshotCreateItemModel.from_yaml(stdout.to_s)
|
||||||
|
|
||||||
|
rescue ex : RuntimeError
|
||||||
|
puts "ERROR: #{ex.message}".colorize(:red)
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
16
src/lib/types.cr
Normal file
16
src/lib/types.cr
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
|
||||||
|
require "./actions"
|
||||||
|
|
||||||
|
module Arkisto
|
||||||
|
alias GlobalOptions = {
|
||||||
|
action: Action.class,
|
||||||
|
verbose: Bool,
|
||||||
|
dry_run: Bool,
|
||||||
|
config_file: String
|
||||||
|
}
|
||||||
|
|
||||||
|
alias ActionOptions = {
|
||||||
|
verbose: Bool,
|
||||||
|
dry_run: Bool
|
||||||
|
}
|
||||||
|
end
|
7
src/lib/version.cr
Normal file
7
src/lib/version.cr
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
module Arkisto
|
||||||
|
class Version
|
||||||
|
PROGRAM_ARKISTOCTL = "arkistoctl"
|
||||||
|
VERSION = "0.1.0"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue