text: # Copyright(c) 2016 Nippon Telegraph and Telephone Corporation
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  
  import testtools
  from unittest import mock
  from xml.etree import ElementTree
  
  import eventlet
  
  from masakarimonitors.hostmonitor.host_handler import parse_cib_xml
  
  eventlet.monkey_patch(os=False)
  
  CIB_XML = '<cib have-quorum="1">' \
            '  <configuration>' \
            '    <crm_config>test</crm_config>' \
            '    <nodes>' \
            '      <node id="1084754452" uname="masakari-node"/>' \
            '      <node id="1084754453" uname="compute-node"/>' \
            '    </nodes>' \
            '    <resources>' \
            '      <group id="grpStonith1">' \
            '        <primitive id="stnt11" type="external/stonith-helper">' \
            '          <instance_attributes id="stnt11-instance_attributes">' \
            '            <nvpair name="hostlist" value="masakari-node"/>' \
            '          </instance_attributes>' \
            '          <operations>' \
            '            <op name="start"/>' \
            '            <op name="monitor"/>' \
            '            <op name="stop"/>' \
            '          </operations>' \
            '        </primitive>' \
            '        <primitive id="stnt12" type="external/ipmi">' \
            '          <instance_attributes id="stnt12-instance_attributes">' \
            '            <nvpair name="pcmk_reboot_timeout" value="60s"/>' \
            '            <nvpair name="hostname" value="masakari-node"/>' \
            '            <nvpair name="ipaddr" value="192.168.10.20"/>' \
            '            <nvpair name="userid" value="admin"/>' \
            '            <nvpair name="passwd" value="password"/>' \
            '            <nvpair name="interface" value="lanplus"/>' \
            '          </instance_attributes>' \
            '          <operations>' \
            '            <op name="start"/>' \
            '            <op name="monitor"/>' \
            '            <op name="stop"/>' \
            '          </operations>' \
            '        </primitive>' \
            '      </group>' \
            '      <group id="grpStonith2">' \
            '        <primitive id="stnt21" type="external/stonith-helper">' \
            '          <instance_attributes id="stnt21-instance_attributes">' \
            '            <nvpair name="hostlist" value="compute-node"/>' \
            '          </instance_attributes>' \
            '          <operations>' \
            '            <op name="start"/>' \
            '            <op name="monitor"/>' \
            '            <op name="stop"/>' \
            '          </operations>' \
            '        </primitive>' \
            '        <primitive id="stnt22" type="external/ipmi">' \
            '          <instance_attributes id="stnt22-instance_attributes">' \
            '            <nvpair name="pcmk_reboot_timeout" value="60s"/>' \
            '            <nvpair name="hostname" value="compute-node"/>' \
            '            <nvpair name="ipaddr" value="192.168.10.21"/>' \
            '            <nvpair name="userid" value="admin"/>' \
            '            <nvpair name="passwd" value="password"/>' \
            '            <nvpair name="interface" value="lanplus"/>' \
            '          </instance_attributes>' \
            '          <operations>' \
            '            <op name="start"/>' \
            '            <op name="monitor"/>' \
            '            <op name="stop"/>' \
            '          </operations>' \
            '        </primitive>' \
            '      </group>' \
            '    </resources>' \
            '    <constraints>' \
            '      <rsc_location id="loc_grpStonith1" rsc="grpStonith1">' \
            '        <rule test="foo"/>' \
            '      </rsc_location>' \
            '    </constraints>' \
            '  </configuration>' \
            '  <status>' \
            '    <node_state uname="masakari-node" crmd="online">' \
            '      <test foo="foo"/>' \
            '    </node_state>' \
            '    <node_state crmd="online" uname="compute-node">' \
            '      <test foo="foo"/>' \
            '    </node_state>' \
            '  </status>' \
            '</cib>'
  CIB_TAG = ElementTree.fromstring(CIB_XML)
  
  
  class TestParseCibXml(testtools.TestCase):
  
      def setUp(self):
          super(TestParseCibXml, self).setUp()
  
      @mock.patch.object(ElementTree, 'fromstring')
      def test_set_cib_xml(self,
                           mock_fromstring):
  
          obj = parse_cib_xml.ParseCibXml()
          mock_fromstring.return_value = CIB_TAG
          obj.set_cib_xml(CIB_XML)
  
      def test_have_quorum(self):
  
          obj = parse_cib_xml.ParseCibXml()
          obj.set_cib_xml(CIB_XML)
          self.assertEqual(1, obj.have_quorum())
  
      def test_get_node_state_tag_list(self):
  
          obj = parse_cib_xml.ParseCibXml()
          obj.set_cib_xml(CIB_XML)
  
          node_state_tag_list = obj.get_node_state_tag_list()
  
          for node_state_tag in node_state_tag_list:
              self.assertEqual('online', node_state_tag.get('crmd'))
  
      def test_get_stonith_ipmi_params(self):
  
          obj = parse_cib_xml.ParseCibXml()
          obj.set_cib_xml(CIB_XML)
  
          ipmi_values = obj.get_stonith_ipmi_params('compute-node')
  
          self.assertEqual('192.168.10.21', ipmi_values['ipaddr'])
          self.assertEqual('admin', ipmi_values['userid'])
          self.assertEqual('password', ipmi_values['passwd'])
          self.assertEqual('lanplus', ipmi_values['interface'])
  