Completed
Pull Request — master (#466)
by
unknown
02:22
created

OrionBaseAction.__init__()   A

Complexity

Conditions 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 2
dl 0
loc 7
rs 9.4285
1
# Licensed to the StackStorm, Inc ('StackStorm') under one or more
2
# contributor license agreements.  See the NOTICE file distributed with
3
# this work for additional information regarding copyright ownership.
4
# The ASF licenses this file to You under the Apache License, Version 2.0
5
# (the "License"); you may not use this file except in compliance with
6
# the License.  You may obtain a copy of the License at
7
#
8
#     http://www.apache.org/licenses/LICENSE-2.0
9
#
10
# Unless required by applicable law or agreed to in writing, software
11
# distributed under the License is distributed on an "AS IS" BASIS,
12
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
# See the License for the specific language governing permissions and
14
# limitations under the License.
15
16
import time
17
18
from st2actions.runners.pythonrunner import Action
19
from orionsdk import SwisClient
20
21
22
class OrionBaseAction(Action):
23
    def __init__(self, config):
24
        super(OrionBaseAction, self).__init__(config)
25
26
        self.swis = None
27
28
        if "orion" not in self.config:
29
            raise ValueError("Orion host details not in the config.yaml")
30
31
    def connect(self, platform):
32
        try:
33
            self.swis = SwisClient(self.config['orion'][platform]['host'],
34
                                   self.config['orion'][platform]['user'],
35
                                   self.config['orion'][platform]['password'])
36
        except KeyError:
37
            raise ValueError("Orion host details not in the config.yaml")
38
39
    def query(self, swql, **kargs):
40
        return self.swis.query(swql, **kargs)
41
42
    def invoke(self, entity, verb, *args):
43
        return self.swis.invoke(entity, verb, *args)
44
45
    def get_ncm_node_id(self, caption):
46
        swql = "SELECT NodeID FROM Cirrus.Nodes WHERE NodeCaption=@node"
47
        kargs = {'node': caption}
48
        data = self.query(swql, **kargs)
49
50
        if len(data['results']) == 1:
51
            try:
52
                return data['results'][0]['NodeID']
53
            except IndexError:
54
                raise IndexError("Invalid Node")
55
        elif len(data['results']) >= 2:
56
            raise IndexError("Muliple Nodes match '{}' NodeCaption".format(
57
                caption))
58
        elif len(data['results']) == 0:
59
            raise IndexError("No matching NodeCaption for '{}'".format(
60
                caption))
61
62
    def get_ncm_transfer_results(self, transfer_id):
63
        ts = {}
64
        while True:
65
            swql = """SELECT TransferID, Action, Status, ErrorMessage,
66
            DeviceOutput FROM NCM.TransferResults
67
            WHERE TransferID=@transfer_id"""
68
            kargs = {'transfer_id': transfer_id}
69
70
            transfer_data = self.query(swql, **kargs)
71
            status = transfer_data['results'][0]['Status']
72
73
            if status == 1:
74
                time.sleep(10)
75
            elif status == 2:
76
                ts['status'] = "Complete"
77
                break
78
            elif status == 3:
79
                ts['status'] = "Error"
80
                ts['ErrorMessage'] = transfer_data['results'][0][
81
                    'ErrorMessage']
82
                break
83
            else:
84
                ts['status'] = "Unknown"
85
                ts['ErrorMessage'] = "Invalid stauts: {}".format(status)
86
                break
87
88
        return ts
89
90
    def status_code_to_text(self, status):
91
        """
92
        Takes an Solarwinds Orion status code and translates it to
93
        human text and also a colour that can be used in Slack.
94
        """
95
96
        if status == 0:
97
            return ("Unknown", "grey")
98
        elif status == 1:
99
            return ("Up", "good")
100
        elif status == 2:
101
            return ("Down", "danger")
102
        elif status == 3:
103
            return ("Warning", "warning")
104
        elif status == 14:
105
            return ("Critical", "danger")
106
107
    def send_user_error(self, message):
108
        print(message)
109