[Kimchi-devel] [PATCH 4/5] Discover Kimchi peers using openSLP

Aline Manera alinefm at linux.vnet.ibm.com
Fri Aug 29 14:11:47 UTC 2014


On 08/28/2014 06:03 PM, Adam Litke wrote:
> On 26/08/14 10:31 -0300, Aline Manera wrote:
>>
>> On 08/26/2014 04:00 AM, Royce Lv wrote:
>>> On 2014年08月21日 05:15, Aline Manera wrote:
>>>> When federation feature is enabled, Kimchi server will be registered
>>>> on openSLP service on server starting up. It will expose the Kimchi 
>>>> URL
>>>> to others Kimchi peers.
>>>>
>>>> To discover Kimchi peers in the same network, the following API is 
>>>> provided:
>>>>
>>>> GET /peers
>>>> [
>>>>     https://ubuntu-vm:8001,
>>>>     https://rhel-vm:8001
>>>> ]
>>>>
>>>> Signed-off-by: Aline Manera <alinefm at linux.vnet.ibm.com>
>>>> ---
>>>>  src/kimchi/control/peers.py | 29 ++++++++++++++++++++++
>>>>  src/kimchi/mockmodel.py     |  6 +++++
>>>>  src/kimchi/model/peers.py   | 59 
>>>> +++++++++++++++++++++++++++++++++++++++++++++
>>>>  tests/test_rest.py          |  4 +++
>>>>  4 files changed, 98 insertions(+)
>>>>  create mode 100644 src/kimchi/control/peers.py
>>>>  create mode 100644 src/kimchi/model/peers.py
>>>>
>>>> diff --git a/src/kimchi/control/peers.py b/src/kimchi/control/peers.py
>>>> new file mode 100644
>>>> index 0000000..f72a38c
>>>> --- /dev/null
>>>> +++ b/src/kimchi/control/peers.py
>>>> @@ -0,0 +1,29 @@
>>>> +#
>>>> +# Project Kimchi
>>>> +#
>>>> +# Copyright IBM, Corp. 2014
>>>> +#
>>>> +# This library is free software; you can redistribute it and/or
>>>> +# modify it under the terms of the GNU Lesser General Public
>>>> +# License as published by the Free Software Foundation; either
>>>> +# version 2.1 of the License, or (at your option) any later version.
>>>> +#
>>>> +# This library is distributed in the hope that it will be useful,
>>>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>>>> +# Lesser General Public License for more details.
>>>> +#
>>>> +# You should have received a copy of the GNU Lesser General Public
>>>> +# License along with this library; if not, write to the Free Software
>>>> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  
>>>> 02110-1301 USA
>>>> +
>>>> +from kimchi.control.base import SimpleCollection
>>>> +from kimchi.control.utils import UrlSubNode
>>>> +
>>>> +
>>>> + at UrlSubNode("peers", True)
>>>> +class Peers(SimpleCollection):
>>>> +    def __init__(self, model):
>>>> +        super(Peers, self).__init__(model)
>>>> +        self.role_key = 'peers'
>>>> +        self.admin_methods = ['GET']
>>>> diff --git a/src/kimchi/mockmodel.py b/src/kimchi/mockmodel.py
>>>> index 57a58d7..107aef4 100644
>>>> --- a/src/kimchi/mockmodel.py
>>>> +++ b/src/kimchi/mockmodel.py
>>>> @@ -884,6 +884,12 @@ class MockModel(object):
>>>>      def groups_get_list(self):
>>>>          return ["groupA", "groupB", "groupC", "groupD"]
>>>>
>>>> +    def peers_get_list(self):
>>>> +        if kconfig.get("server", "federation") == "off":
>>>> +            return []
>>>> +
>>>> +        return ["https://serverA:8001", "https://serverB:8001"]
>>>> +
>>>>      def vms_get_list_by_state(self, state):
>>>>          ret_list = []
>>>>          for name in self.vms_get_list():
>>>> diff --git a/src/kimchi/model/peers.py b/src/kimchi/model/peers.py
>>>> new file mode 100644
>>>> index 0000000..01e9210
>>>> --- /dev/null
>>>> +++ b/src/kimchi/model/peers.py
>>>> @@ -0,0 +1,59 @@
>>>> +#
>>>> +# Project Kimchi
>>>> +#
>>>> +# Copyright IBM, Corp. 2014
>>>> +#
>>>> +# This library is free software; you can redistribute it and/or
>>>> +# modify it under the terms of the GNU Lesser General Public
>>>> +# License as published by the Free Software Foundation; either
>>>> +# version 2.1 of the License, or (at your option) any later version.
>>>> +#
>>>> +# This library is distributed in the hope that it will be useful,
>>>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>>>> +# Lesser General Public License for more details.
>>>> +#
>>>> +# You should have received a copy of the GNU Lesser General Public
>>>> +# License along with this library; if not, write to the Free Software
>>>> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  
>>>> 02110-1301 USA
>>>> +
>>>> +import re
>>>> +import socket
>>>> +
>>>> +from kimchi.config import config
>>>> +from kimchi.utils import kimchi_log, run_command
>>>> +
>>>> +
>>>> +class PeersModel(object):
>>>> +    def __init__(self, **kargs):
>>>> +        # check federation feature is enabled on Kimchi server
>>>> +        if config.get("server", "federation") == "off":
>>>> +            return
>>>> +
>>>> +        # register server on openslp
>>>> +        hostname = socket.getfqdn(config.get("server", "host"))
>>>> +        port = config.get("server", "ssl_port")
>>>> +        self.url = hostname + ":" + port
>>>> +
>>>> +        cmd = ["slptool", "register",
>>>> +               "service:kimchid://%s:%s" % (hostname, port)]
>>> Dependencies?
>>
>> Good point. As I said before I don't think federation must be a 
>> mandatory feature as it is not related to virtualization.
>> Because that I added a new README-federation file to guide the user 
>> on how setup the Kimchi server to enable federation.
>>
>> I know the deb package has a "Suggested" packages section, we can add 
>> openslp there
>> But rpm does not have a similar approach in this case.
>
> For features that are modular I'd suggest creating a package called
> kimchi-federation that depends on openslp.  This package could install
> something into the kimchi directory that enables federation on the
> server at the same time.  Then people can easily have a streamlined
> installation of kimchi or a more featureful one.

Thanks for the suggestion, Adam!
As we are close to the code freeze I will open a bug for it to track 
during the stabilization phase.

>
>>
>>>> +        out, error, ret = run_command(cmd)
>>>> +        if len(out) != 0:
>>>> +            kimchi_log.error("Unable to register server on openSLP."
>>>> +                             " Details: %s" % out)
>>>> +
>>>> +    def get_list(self):
>>>> +        # check federation feature is enabled on Kimchi server
>>>> +        if config.get("server", "federation") == "off":
>>>> +            return []
>>>> +
>>>> +        peers = []
>>>> +        cmd = ["slptool", "findsrvs", "service:kimchid"]
>>>> +        out, error, ret = run_command(cmd)
>>>> +        for server in out.strip().split("\n"):
>>>> +            match = re.match("service:kimchid://(.*?),.*", server)
>>>> +            peer = match.group(1)
>>>> +            if peer != self.url:
>>>> +                peers.append("https://" + peer)
>>>> +
>>>> +        return peers
>>>> diff --git a/tests/test_rest.py b/tests/test_rest.py
>>>> index 9066857..a070f14 100644
>>>> --- a/tests/test_rest.py
>>>> +++ b/tests/test_rest.py
>>>> @@ -1539,6 +1539,10 @@ class RestTests(unittest.TestCase):
>>>>          self.assertIn('update_tool', conf)
>>>>          self.assertIn('repo_mngt_tool', conf)
>>>>
>>>> +    def test_peers(self):
>>>> +        resp = self.request('/peers').read()
>>>> +        self.assertEquals([], json.loads(resp))
>>>> +
>>>>      def test_auth_unprotected(self):
>>>>          hdrs = {'AUTHORIZATION': ''}
>>>>          uris = ['/js/kimchi.min.js',
>>>
>>
>> _______________________________________________
>> Kimchi-devel mailing list
>> Kimchi-devel at ovirt.org
>> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>




More information about the Kimchi-devel mailing list