summaryrefslogtreecommitdiff
path: root/lib/tapicero/replication.rb
blob: 1a2db22e453d457d275978f71e1cfb8993491571 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
require 'couchrest'
require 'json'

module Tapicero
  class Replication

    LocalEndpoint = Struct.new(:name) do
      def key; name; end
      def url; name; end
      def save_url; name; end
    end

    RemoteEndpoint = Struct.new(:remote, :credentials) do
      def key;        domain; end
      def url;       "http://#{creds}@#{domain}:#{port}/#{name}"; end
      def save_url;  "http://#{username}@#{domain}:#{port}/#{name}"; end
      def domain;    remote[:internal_domain]; end
      def port;      remote[:couch_port]; end
      def name;      remote[:name]; end
      def creds;     username + ':' + credentials[:password]; end
      def username;  credentials[:username]; end
    end

    def initialize(source, target)
      @source = endpoint_for(source)
      @target = endpoint_for(target)
    end

    def run(options)
      Tapicero.logger.debug "Replicating from #{source.save_url} to #{target.save_url}."
      replication_db.save_doc replication_doc.merge(options)
    end

    def replication_doc
      {
        _id: "#{source.key}_to_#{target.key}"
        source: source.url,
        target: target.url,
        user_ctx: {
          name: replication_credentials[:username],
          roles: [replication_credentials[:role]]
        }
      }
    end

    protected

    def endpoint_for(hash_or_string)
      hash_or_string.respond_to? :[] ?
        RemoteEndpoint.new(hash_or_string, replication_credentials) :
        LocalEndpoint.new(hash_or_string)
    end

    def replication_credentials
      config.options[:replication].slice(:username, :password, :role)
    end

    def replication_db
      @replication_db ||= couch.database('_replicator')
    end

    def couch
      @couch ||= CouchRest.new(config.couch_host)
    end

    def config
      Tapicero.config
    end

end