Class: AutoConsul::Cluster::Registry::S3Provider

Inherits:
Provider
  • Object
show all
Defined in:
lib/auto-consul/providers/s3.rb

Defined Under Namespace

Classes: S3Member

Constant Summary collapse

KEY_TIMESTAMP_FORMAT =
'%Y%m%d%H%M%S'

Instance Attribute Summary

Attributes inherited from Provider

#uri

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Provider

#initialize

Constructor Details

This class inherits a constructor from AutoConsul::Cluster::Registry::Provider

Class Method Details

.from_key_base(key_base) ⇒ Object



63
64
65
66
# File 'lib/auto-consul/providers/s3.rb', line 63

def self.from_key_base key_base
  stamp, identifier = key_base.split('-', 2)
  [read_stamp(stamp), identifier]
end

.get_s3Object



28
29
30
# File 'lib/auto-consul/providers/s3.rb', line 28

def self.get_s3
  AWS::S3.new
end

.read_stamp(stamp) ⇒ Object



54
55
56
57
# File 'lib/auto-consul/providers/s3.rb', line 54

def self.read_stamp stamp
  t = Time.strptime(stamp, KEY_TIMESTAMP_FORMAT)
  Time.utc(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
end

.to_key_base(time, identifier) ⇒ Object



59
60
61
# File 'lib/auto-consul/providers/s3.rb', line 59

def self.to_key_base time, identifier
  "#{write_stamp time}-#{identifier.to_s}"
end

.write_stamp(time) ⇒ Object



50
51
52
# File 'lib/auto-consul/providers/s3.rb', line 50

def self.write_stamp time
  time.dup.utc.strftime KEY_TIMESTAMP_FORMAT
end

Instance Method Details

#bucketObject



36
37
38
# File 'lib/auto-consul/providers/s3.rb', line 36

def bucket
  @bucket ||= s3.buckets[bucket_name]
end

#bucket_nameObject



32
33
34
# File 'lib/auto-consul/providers/s3.rb', line 32

def bucket_name
  uri.host
end

#deletes!(deletes) ⇒ Object



104
105
106
# File 'lib/auto-consul/providers/s3.rb', line 104

def deletes! deletes
  bucket.objects.delete deletes if deletes.size > 0
end

#heartbeat!(identity, data, expiry = nil) ⇒ Object



72
73
74
75
76
# File 'lib/auto-consul/providers/s3.rb', line 72

def heartbeat! identity, data, expiry=nil
  result = bucket.objects[write_key now, identity].write data
  purge!(expiry) unless expiry.nil?
  result
end

#key_prefixObject



40
41
42
# File 'lib/auto-consul/providers/s3.rb', line 40

def key_prefix
  uri.path[1..-1]
end

#members(expiry) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/auto-consul/providers/s3.rb', line 85

def members expiry
  deletes, actives = [], {}
  # The expiry gives an exclusive boundary, not an inclusive,
  # so the minimal allowable key must begin one second after the
  # specified expiry (given a resolution of seconds).
  min_time = Time.now.utc - expiry + 1
  min_key = File.join(key_prefix, min_time.strftime('%Y%m%d%H%M%S-'))
  bucket.objects.with_prefix(key_prefix).each do |obj|
    if obj.key < min_key
      deletes << obj
    else
      o = S3Member.new(obj)
      actives[o.identifier] = o
    end
  end
  deletes! deletes
  actives.values.sort_by {|m| [m.time, m.identifier]}
end

#nowObject



44
45
46
# File 'lib/auto-consul/providers/s3.rb', line 44

def now
  Time.now
end

#purge!(expiry) ⇒ Object



78
79
80
81
82
83
# File 'lib/auto-consul/providers/s3.rb', line 78

def purge! expiry
  min_key = File.join(key_prefix, "#{self.class.write_stamp(Time.now - expiry + 1)}-")
  bucket.objects.with_prefix(key_prefix).delete_if do |s3obj|
    s3obj.key < min_key
  end
end

#s3Object



24
25
26
# File 'lib/auto-consul/providers/s3.rb', line 24

def s3
  @s3 ||= self.class.get_s3
end

#write_key(time, identity) ⇒ Object



68
69
70
# File 'lib/auto-consul/providers/s3.rb', line 68

def write_key time, identity
  File.join(key_prefix, self.class.to_key_base(time, identity))
end