Idea 1
This commit is contained in:
parent
85f18de8b1
commit
f18f8d2e02
146
example-riaks.py
Normal file
146
example-riaks.py
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
import click
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
from solar.core import actions
|
||||||
|
from solar.core import resource
|
||||||
|
from solar.core import signals
|
||||||
|
from solar.core import validation
|
||||||
|
from solar.core.resource import virtual_resource as vr
|
||||||
|
from solar import errors
|
||||||
|
|
||||||
|
from solar.interfaces.db import get_db
|
||||||
|
|
||||||
|
from solar import events as evapi
|
||||||
|
from solar.events.controls import React, Dep
|
||||||
|
from solar.events.api import add_event
|
||||||
|
|
||||||
|
|
||||||
|
db = get_db()
|
||||||
|
|
||||||
|
|
||||||
|
def setup_riak():
|
||||||
|
db.clear()
|
||||||
|
signals.Connections.clear()
|
||||||
|
|
||||||
|
nodes = vr.create('nodes', 'templates/riak_nodes.yml', {})
|
||||||
|
node1, node2, node3 = nodes
|
||||||
|
|
||||||
|
riak_services = []
|
||||||
|
ips = '10.0.0.%d'
|
||||||
|
for i in xrange(3):
|
||||||
|
num = i + 1
|
||||||
|
ip = ips % (num + 2) # XXX: da rade inaczej ?
|
||||||
|
r = vr.create('riak_service%d' % num,
|
||||||
|
'resources/riak_node',
|
||||||
|
{'riak_name': 'riak%d@%s' % (num, ip)})[0]
|
||||||
|
riak_services.append(r)
|
||||||
|
|
||||||
|
for i, riak in enumerate(riak_services):
|
||||||
|
signals.connect(nodes[i], riak)
|
||||||
|
|
||||||
|
joiners = []
|
||||||
|
for i in xrange(2):
|
||||||
|
num = i + 1
|
||||||
|
join = vr.create('riak_join_single%d' % num,
|
||||||
|
'resources/riak_join_single', {})[0]
|
||||||
|
joiners.append(join)
|
||||||
|
|
||||||
|
for i, riak in enumerate(riak_services[:-1]):
|
||||||
|
signals.connect(nodes[i+1], joiners[i])
|
||||||
|
signals.connect(riak, joiners[i], {'riak_name': 'join_to'})
|
||||||
|
# signals.connect(riak, riak_joiner_service, {'riak_name': 'join_to'})
|
||||||
|
# signals.connect(riak, riak_joiner_service, {'ip': 'join_from'})
|
||||||
|
|
||||||
|
commiter = vr.create('riak_commit1', 'resources/riak_commit', {})[0]
|
||||||
|
# for joiner in joiners:
|
||||||
|
# signals.connect(joiner, commiter, {'join_to': 'riak_names'})
|
||||||
|
signals.connect(node1, commiter)
|
||||||
|
|
||||||
|
has_errors = False
|
||||||
|
for r in locals().values():
|
||||||
|
|
||||||
|
# TODO: handle list
|
||||||
|
if not isinstance(r, resource.Resource):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# print 'Validating {}'.format(r.name)
|
||||||
|
errors = validation.validate_resource(r)
|
||||||
|
if errors:
|
||||||
|
has_errors = True
|
||||||
|
print 'ERROR: %s: %s' % (r.name, errors)
|
||||||
|
|
||||||
|
if has_errors:
|
||||||
|
print "ERRORS"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
events = [
|
||||||
|
React('riak_service2', 'run', 'success', 'riak_join_single1', 'join'),
|
||||||
|
React('riak_service3', 'run', 'success', 'riak_join_single2', 'join'),
|
||||||
|
React('riak_join_single1', 'join', 'success', 'riak_commit1', 'commit'),
|
||||||
|
React('riak_join_single2', 'join', 'success', 'riak_commit1', 'commit')
|
||||||
|
]
|
||||||
|
|
||||||
|
for event in events:
|
||||||
|
add_event(event)
|
||||||
|
|
||||||
|
print 'Use orch'
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
resources_to_run = [
|
||||||
|
'riak_service1',
|
||||||
|
'riak_service2',
|
||||||
|
'riak_service3',
|
||||||
|
# 'riak_join_single1',
|
||||||
|
# 'riak_join_single2',
|
||||||
|
# 'riak_commit1'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@click.group()
|
||||||
|
def main():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@click.command()
|
||||||
|
def deploy():
|
||||||
|
setup_riak()
|
||||||
|
|
||||||
|
resources = map(resource.wrap_resource, db.get_list(collection=db.COLLECTIONS.resource))
|
||||||
|
resources = {r.name: r for r in resources}
|
||||||
|
|
||||||
|
for name in resources_to_run:
|
||||||
|
try:
|
||||||
|
actions.resource_action(resources[name], 'run')
|
||||||
|
except errors.SolarError as e:
|
||||||
|
print 'WARNING: %s' % str(e)
|
||||||
|
raise
|
||||||
|
|
||||||
|
time.sleep(10)
|
||||||
|
|
||||||
|
|
||||||
|
@click.command()
|
||||||
|
def undeploy():
|
||||||
|
resources = map(resource.wrap_resource, db.get_list(collection=db.COLLECTIONS.resource))
|
||||||
|
resources = {r.name: r for r in resources}
|
||||||
|
|
||||||
|
for name in reversed(resources_to_run):
|
||||||
|
try:
|
||||||
|
actions.resource_action(resources[name], 'remove')
|
||||||
|
except errors.SolarError as e:
|
||||||
|
print 'WARNING: %s' % str(e)
|
||||||
|
|
||||||
|
db.clear()
|
||||||
|
|
||||||
|
signals.Connections.clear()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
main.add_command(deploy)
|
||||||
|
main.add_command(undeploy)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
4
resources/riak_commit/actions/commit.yml
Normal file
4
resources/riak_commit/actions/commit.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
- hosts: [{{ip}}]
|
||||||
|
sudo: yes
|
||||||
|
tasks:
|
||||||
|
- shell: riak-admin cluster commit
|
18
resources/riak_commit/meta.yaml
Normal file
18
resources/riak_commit/meta.yaml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
id: riak_commit
|
||||||
|
handler: ansible
|
||||||
|
version: 1.0.0
|
||||||
|
actions:
|
||||||
|
commit: actions/commit.yml
|
||||||
|
input:
|
||||||
|
ip:
|
||||||
|
schema: str!
|
||||||
|
value:
|
||||||
|
ssh_key:
|
||||||
|
schema: str!
|
||||||
|
value:
|
||||||
|
ssh_user:
|
||||||
|
schema: str!
|
||||||
|
value:
|
||||||
|
riak_names:
|
||||||
|
schema: [{riak_name: str}]
|
||||||
|
value: []
|
4
resources/riak_join_single/actions/join.yml
Normal file
4
resources/riak_join_single/actions/join.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
- hosts: [{{ip}}]
|
||||||
|
sudo: yes
|
||||||
|
tasks:
|
||||||
|
- shell: riak-admin cluster join {{join_to}}
|
18
resources/riak_join_single/meta.yaml
Normal file
18
resources/riak_join_single/meta.yaml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
id: riak_join_single
|
||||||
|
handler: ansible
|
||||||
|
version: 1.0.0
|
||||||
|
actions:
|
||||||
|
join: actions/join.yml
|
||||||
|
input:
|
||||||
|
join_to:
|
||||||
|
schema: str!
|
||||||
|
value:
|
||||||
|
ip:
|
||||||
|
schema: str!
|
||||||
|
value:
|
||||||
|
ssh_key:
|
||||||
|
schema: str!
|
||||||
|
value:
|
||||||
|
ssh_user:
|
||||||
|
schema: str!
|
||||||
|
value:
|
4
resources/riak_node/actions/commit.yml
Normal file
4
resources/riak_node/actions/commit.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
- hosts: [{{ip}}]
|
||||||
|
sudo: yes
|
||||||
|
tasks:
|
||||||
|
- shell: riak-admin cluster commit
|
6
resources/riak_node/actions/remove.yml
Normal file
6
resources/riak_node/actions/remove.yml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
- hosts: [{{ip}}]
|
||||||
|
sudo: yes
|
||||||
|
tasks:
|
||||||
|
- apt:
|
||||||
|
name: riak
|
||||||
|
state: absent
|
25
resources/riak_node/actions/run.yml
Normal file
25
resources/riak_node/actions/run.yml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
- hosts: [{{ip}}]
|
||||||
|
sudo: yes
|
||||||
|
tasks:
|
||||||
|
- shell: curl -s https://packagecloud.io/install/repositories/basho/riak/script.deb.sh | sudo bash
|
||||||
|
- apt:
|
||||||
|
name: riak
|
||||||
|
state: present
|
||||||
|
# - shell: sed -ie "s/127.0.0.1/{{ip}}/g" /etc/riak/riak.conf
|
||||||
|
- service:
|
||||||
|
name: riak
|
||||||
|
state: stopped
|
||||||
|
- replace:
|
||||||
|
dest: /etc/riak/riak.conf
|
||||||
|
regexp: '127.0.0.1'
|
||||||
|
replace: '0.0.0.0'
|
||||||
|
- replace:
|
||||||
|
dest: /etc/riak/riak.conf
|
||||||
|
regexp: '^nodename = .*\n'
|
||||||
|
replace: 'nodename = {{riak_name}}\n\n'
|
||||||
|
# TODO: should use name/hostname instead of ip
|
||||||
|
- shell: rm -fr /var/lib/riak/kv_vnode/*
|
||||||
|
- shell: rm -fr /var/lib/riak/ring/*
|
||||||
|
- service:
|
||||||
|
name: riak
|
||||||
|
state: reloaded
|
17
resources/riak_node/meta.yaml
Normal file
17
resources/riak_node/meta.yaml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
id: riak_node
|
||||||
|
handler: ansible
|
||||||
|
version: 1.0.0
|
||||||
|
actions:
|
||||||
|
input:
|
||||||
|
ip:
|
||||||
|
schema: str!
|
||||||
|
value:
|
||||||
|
ssh_key:
|
||||||
|
schema: str!
|
||||||
|
value:
|
||||||
|
ssh_user:
|
||||||
|
schema: str!
|
||||||
|
value:
|
||||||
|
riak_name:
|
||||||
|
schema: str!
|
||||||
|
value:
|
10
solar/solar/core/handlers/python.py
Normal file
10
solar/solar/core/handlers/python.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from fabric import api as fabric_api
|
||||||
|
|
||||||
|
from solar.core.handlers.base import TempFileHandler
|
||||||
|
|
||||||
|
|
||||||
|
class Python(TempFileHandler):
|
||||||
|
def action(self, resource, action_name):
|
||||||
|
action_file = self._compile_action_file(resource, action_name)
|
||||||
|
fabric_api.local('python {}'.format(action_file))
|
20
templates/riak_nodes.yml
Normal file
20
templates/riak_nodes.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
id: simple_riak_cluster
|
||||||
|
resources:
|
||||||
|
- id: node1
|
||||||
|
from: resources/ro_node
|
||||||
|
values:
|
||||||
|
ip: '10.0.0.3'
|
||||||
|
ssh_key: '/vagrant/.vagrant/machines/solar-dev1/virtualbox/private_key'
|
||||||
|
ssh_user: 'vagrant'
|
||||||
|
- id: node2
|
||||||
|
from: resources/ro_node
|
||||||
|
values:
|
||||||
|
ip: '10.0.0.4'
|
||||||
|
ssh_key: '/vagrant/.vagrant/machines/solar-dev2/virtualbox/private_key'
|
||||||
|
ssh_user: 'vagrant'
|
||||||
|
- id: node3
|
||||||
|
from: resources/ro_node
|
||||||
|
values:
|
||||||
|
ip: '10.0.0.5'
|
||||||
|
ssh_key: '/vagrant/.vagrant/machines/solar-dev3/virtualbox/private_key'
|
||||||
|
ssh_user: 'vagrant'
|
Loading…
x
Reference in New Issue
Block a user