diff options
Diffstat (limited to 'puppet/modules/site_couchdb')
5 files changed, 91 insertions, 8 deletions
diff --git a/puppet/modules/site_couchdb/lib/puppet/parser/functions/rotated_db_name.rb b/puppet/modules/site_couchdb/lib/puppet/parser/functions/rotated_db_name.rb new file mode 100644 index 00000000..6458ae81 --- /dev/null +++ b/puppet/modules/site_couchdb/lib/puppet/parser/functions/rotated_db_name.rb @@ -0,0 +1,24 @@ +module Puppet::Parser::Functions +  newfunction(:rotated_db_name, :type => :rvalue, :doc => <<-EOS +This function takes a database name string and returns a database name with the current rotation stamp appended. +The first argument is the base name of the database. Subsequent arguments may contain these options: +  * 'next'    -- return the db name for the next rotation, not the current one. +  * 'monthly' -- rotate monthly (default) +  * 'weekly'  -- rotate weekly +*Examples:* +    rotated_db_name('tokens') => 'tokens_551' +    EOS +  ) do |arguments| +    if arguments.include?('weekly') +      rotation_period = 604800 # 1 week +    else +      rotation_period = 2592000 # 1 month +    end +    suffix = Time.now.utc.to_i / rotation_period +    if arguments.include?('next') +      suffix += 1 +    end +    "#{arguments.first}_#{suffix}" +  end +end + diff --git a/puppet/modules/site_couchdb/manifests/bigcouch.pp b/puppet/modules/site_couchdb/manifests/bigcouch.pp index 16593ec7..82c85b52 100644 --- a/puppet/modules/site_couchdb/manifests/bigcouch.pp +++ b/puppet/modules/site_couchdb/manifests/bigcouch.pp @@ -17,6 +17,7 @@ class site_couchdb::bigcouch {    # stunnel must running correctly before bigcouch dbs can be set up.    #    Class['site_config::default'] +    -> Class['site_config::resolvconf']      -> Class['couchdb::bigcouch::package::cloudant']      -> Service['shorewall']      -> Exec['refresh_stunnel'] diff --git a/puppet/modules/site_couchdb/manifests/create_dbs.pp b/puppet/modules/site_couchdb/manifests/create_dbs.pp index 4322f773..b743127a 100644 --- a/puppet/modules/site_couchdb/manifests/create_dbs.pp +++ b/puppet/modules/site_couchdb/manifests/create_dbs.pp @@ -1,10 +1,9 @@  class site_couchdb::create_dbs {    Class['site_couchdb::setup'] +    -> Class['site_couchdb::bigcouch::settle_cluster']      -> Class['site_couchdb::create_dbs'] -  # Couchdb databases -    ### customer database    ### r/w: webapp,    couchdb::create_db { 'customers': @@ -29,7 +28,14 @@ class site_couchdb::create_dbs {    ## sessions database    ## r/w: webapp -  couchdb::create_db { 'sessions': +  $sessions_db = rotated_db_name('sessions', 'monthly') +  couchdb::create_db { $sessions_db: +    members => "{ \"names\": [\"$site_couchdb::couchdb_webapp_user\"], \"roles\": [\"replication\"] }", +    require => Couchdb::Query::Setup['localhost'] +  } + +  $sessions_next_db = rotated_db_name('sessions', 'monthly', 'next') +  couchdb::create_db { $sessions_next_db:      members => "{ \"names\": [\"$site_couchdb::couchdb_webapp_user\"], \"roles\": [\"replication\"] }",      require => Couchdb::Query::Setup['localhost']    } @@ -51,7 +57,14 @@ class site_couchdb::create_dbs {    ## tokens database    ## r: soledad - needs to be restricted with a design document    ## r/w: webapp -  couchdb::create_db { 'tokens': +  $tokens_db = rotated_db_name('tokens', 'monthly') +  couchdb::create_db { $tokens_db: +    members => "{ \"names\": [], \"roles\": [\"replication\", \"tokens\"] }", +    require => Couchdb::Query::Setup['localhost'] +  } + +  $tokens_next_db = rotated_db_name('tokens', 'monthly', 'next') +  couchdb::create_db { $tokens_next_db:      members => "{ \"names\": [], \"roles\": [\"replication\", \"tokens\"] }",      require => Couchdb::Query::Setup['localhost']    } @@ -63,6 +76,13 @@ class site_couchdb::create_dbs {      require => Couchdb::Query::Setup['localhost']    } +  ## tmp_users database +  ## r/w: webapp +  couchdb::create_db { 'tmp_users': +    members => "{ \"names\": [], \"roles\": [\"replication\", \"users\"] }", +    require => Couchdb::Query::Setup['localhost'] +  } +    ## messages db    ## store messages to the clients such as payment reminders    ## r/w: webapp diff --git a/puppet/modules/site_couchdb/manifests/designs.pp b/puppet/modules/site_couchdb/manifests/designs.pp index 9e88de64..1ab1c6a1 100644 --- a/puppet/modules/site_couchdb/manifests/designs.pp +++ b/puppet/modules/site_couchdb/manifests/designs.pp @@ -11,10 +11,35 @@ class site_couchdb::designs {      mode    => '0755'    } -  exec { '/srv/leap/couchdb/scripts/load_design_documents.sh': -    require     => Vcsrepo['/srv/leap/couchdb/scripts'], -    refreshonly => false +  site_couchdb::upload_design { +    'customers':   design => 'customers/Customer.json'; +    'identities':  design => 'identities/Identity.json'; +    'tickets':     design => 'tickets/Ticket.json'; +    'messages':    design => 'messages/Message.json'; +    'users':       design => 'users/User.json'; +    'tmp_users':   design => 'users/User.json'; +    'shared_docs': +      db => 'shared', +      design => 'shared/docs.json'; +    'shared_syncs': +      db => 'shared', +      design => 'shared/syncs.json'; +    'shared_transactions': +      db => 'shared', +      design => 'shared/transactions.json';    } -} +  $sessions_db      = rotated_db_name('sessions', 'monthly') +  $sessions_next_db = rotated_db_name('sessions', 'monthly', 'next') +  site_couchdb::upload_design { +    $sessions_db:       design => 'sessions/Session.json'; +    $sessions_next_db:  design => 'sessions/Session.json'; +  } +  $tokens_db       = rotated_db_name('tokens', 'monthly') +  $tokens_next_db  = rotated_db_name('tokens', 'monthly', 'next') +  site_couchdb::upload_design { +    $tokens_db:      design => 'tokens/Token.json'; +    $tokens_next_db: design => 'tokens/Token.json'; +  } +} diff --git a/puppet/modules/site_couchdb/manifests/upload_design.pp b/puppet/modules/site_couchdb/manifests/upload_design.pp new file mode 100644 index 00000000..7b0cabd7 --- /dev/null +++ b/puppet/modules/site_couchdb/manifests/upload_design.pp @@ -0,0 +1,13 @@ +define site_couchdb::upload_design($db = $title, $design) { +  $design_name = regsubst($design, '^.*\/(.*)\.json$', '\1') +  $id = "_design/${design_name}" +  $file = "/srv/leap/couchdb/designs/${design}" +  exec { +    "upload_design_${name}": +      command => "/usr/local/bin/couch-doc-update --host 127.0.0.1:5984 --db '${db}' --id '${id}' --data '{}' --file '${file}'", +      refreshonly => false, +      loglevel => debug, +      logoutput => on_failure, +      require => File['/srv/leap/couchdb/designs']; +  } +}  | 
