~verterok/charms/trusty/mongodb/fix-data_directory-migration

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env python3

import amulet
import requests
import time
from pymongo import MongoClient
from collections import Counter


#########################################################
# Test Quick Config
#########################################################
scale = 3
seconds = 1800

# amount of time to wait before testing for replicaset
# status
wait_for_replicaset = 15

#########################################################
# 3shard cluster configuration
#########################################################
d = amulet.Deployment(series='trusty')

d.add('mongodb', charm='mongodb', units=scale)
d.expose('mongodb')

# Perform the setup for the deployment.
try:
    d.setup(seconds)
    d.sentry.wait(seconds)
except amulet.helpers.TimeoutError:
    message = 'The environment did not setup in %d seconds.', seconds
    amulet.raise_status(amulet.SKIP, msg=message)
except:
    raise

sentry_dict = {
    'mongodb0-sentry': d.sentry.unit['mongodb/0'],
    'mongodb1-sentry': d.sentry.unit['mongodb/1'],
    'mongodb2-sentry': d.sentry.unit['mongodb/2'],
}


#############################################################
# Check presence of MongoDB GUI HEALTH Status
#############################################################
def validate_status_interface():
    r = requests.get("http://{}:28017".format(
        d.sentry.unit['mongodb/0'].info['public-address']),
        verify=False)
    r.raise_for_status


#############################################################
# Validate that each unit has an active mongo service
#############################################################
def validate_running_services():
    for service in sentry_dict:
        output = sentry_dict[service].run('service mongodb status')
        service_active = str(output).find('mongodb start/running')
        if service_active == -1:
            message = "Failed to find running MongoDB on host {}".format(
                service)
            amulet.raise_status(amulet.SKIP, msg=message)


#############################################################
# Validate proper replicaset setup
#############################################################
def validate_replicaset_setup():

    time.sleep(wait_for_replicaset)

    unit_status = []

    for service in sentry_dict:
        client = MongoClient(sentry_dict[service].info['public-address'])
        r = client.admin.command('replSetGetStatus')
        unit_status.append(r['myState'])
        client.close()

    primaries = Counter(unit_status)[1]
    if primaries != 1:
        message = "Only one PRIMARY unit allowed! Found: %s" % (primaries)
        amulet.raise_status(amulet.FAIL, message)

    secondrs = Counter(unit_status)[2]
    if secondrs != 2:
        message = "Only two SECONDARY units allowed! (Found %s)" % (secondrs)
        amulet.raise_status(amulet.FAIL, message)


#############################################################
# Validate connectivity from $WORLD
#############################################################
def validate_world_connectivity():
    client = MongoClient(d.sentry.unit['mongodb/0'].info['public-address'])

    db = client['test']
    # Can we successfully insert?
    insert_id = db.amulet.insert({'assert': True})
    if insert_id is None:
        amulet.raise_status(amulet.FAIL, msg="Failed to insert test data")
    # Can we delete from a shard using the Mongos hub?
    result = db.amulet.remove(insert_id)
    if result['err'] is not None:
        amulet.raise_status(amulet.FAIL, msg="Failed to remove test data")


validate_status_interface()
validate_running_services()
validate_replicaset_setup()
validate_world_connectivity()