Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
On 08/27/2015 07:21 PM, Oleg Fayans wrote: Hi Martin, My bad, forgot to do git add. On 08/27/2015 06:27 PM, Martin Basti wrote: On 08/27/2015 05:41 PM, Oleg Fayans wrote: Hi, I am sorry I have missed that. Fixed. The test fails now due to this bug: https://fedorahosted.org/freeipa/ticket/5222 The test output is attached together with the updated patch On 08/26/2015 05:53 PM, Martin Basti wrote: On 08/26/2015 05:42 PM, Martin Basti wrote: On 08/26/2015 02:53 PM, Oleg Fayans wrote: Hi, No more short links :) On 08/26/2015 11:50 AM, Tomas Babej wrote: On 08/26/2015 11:44 AM, Oleg Fayans wrote: Hi Martin, On 08/20/2015 11:18 AM, Martin Basti wrote: On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. Fixed. It was a regex error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there + tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Hi, I am sorry I have missed that. Fixed. The test fails now due to this bug: https://fedorahosted.org/freeipa/ticket/5222 The test output is attached together with the updated patch On 08/26/2015 05:53 PM, Martin Basti wrote: On 08/26/2015 05:42 PM, Martin Basti wrote: On 08/26/2015 02:53 PM, Oleg Fayans wrote: Hi, No more short links :) On 08/26/2015 11:50 AM, Tomas Babej wrote: On 08/26/2015 11:44 AM, Oleg Fayans wrote: Hi Martin, On 08/20/2015 11:18 AM, Martin Basti wrote: On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. Fixed. It was a regex error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Hi Martin, My bad, forgot to do git add. On 08/27/2015 06:27 PM, Martin Basti wrote: On 08/27/2015 05:41 PM, Oleg Fayans wrote: Hi, I am sorry I have missed that. Fixed. The test fails now due to this bug: https://fedorahosted.org/freeipa/ticket/5222 The test output is attached together with the updated patch On 08/26/2015 05:53 PM, Martin Basti wrote: On 08/26/2015 05:42 PM, Martin Basti wrote: On 08/26/2015 02:53 PM, Oleg Fayans wrote: Hi, No more short links :) On 08/26/2015 11:50 AM, Tomas Babej wrote: On 08/26/2015 11:44 AM, Oleg Fayans wrote: Hi Martin, On 08/20/2015 11:18 AM, Martin Basti wrote: On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. Fixed. It was a regex error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there + tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute,
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
On 08/27/2015 05:41 PM, Oleg Fayans wrote: Hi, I am sorry I have missed that. Fixed. The test fails now due to this bug: https://fedorahosted.org/freeipa/ticket/5222 The test output is attached together with the updated patch On 08/26/2015 05:53 PM, Martin Basti wrote: On 08/26/2015 05:42 PM, Martin Basti wrote: On 08/26/2015 02:53 PM, Oleg Fayans wrote: Hi, No more short links :) On 08/26/2015 11:50 AM, Tomas Babej wrote: On 08/26/2015 11:44 AM, Oleg Fayans wrote: Hi Martin, On 08/20/2015 11:18 AM, Martin Basti wrote: On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. Fixed. It was a regex error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there + tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
On 08/26/2015 05:42 PM, Martin Basti wrote: On 08/26/2015 02:53 PM, Oleg Fayans wrote: Hi, No more short links :) On 08/26/2015 11:50 AM, Tomas Babej wrote: On 08/26/2015 11:44 AM, Oleg Fayans wrote: Hi Martin, On 08/20/2015 11:18 AM, Martin Basti wrote: On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. Fixed. It was a regex error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Hi Martin, On 08/20/2015 11:18 AM, Martin Basti wrote: On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. Fixed. It was a regex error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. 1) +# empty comment here (several times) Removed NACK you changed it wrong
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
On 08/26/2015 11:44 AM, Oleg Fayans wrote: Hi Martin, On 08/20/2015 11:18 AM, Martin Basti wrote: On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. Fixed. It was a regex error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'),
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Hi, No more short links :) On 08/26/2015 11:50 AM, Tomas Babej wrote: On 08/26/2015 11:44 AM, Oleg Fayans wrote: Hi Martin, On 08/20/2015 11:18 AM, Martin Basti wrote: On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. Fixed. It was a regex error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file,
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
On 08/26/2015 02:53 PM, Oleg Fayans wrote: Hi, No more short links :) On 08/26/2015 11:50 AM, Tomas Babej wrote: On 08/26/2015 11:44 AM, Oleg Fayans wrote: Hi Martin, On 08/20/2015 11:18 AM, Martin Basti wrote: On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. Fixed. It was a regex error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
On 08/20/2015 10:26 AM, Martin Basti wrote: On 08/19/2015 04:17 PM, Martin Basti wrote: I got this: https://paste.fedoraproject.org/256746/43999380/ FYI replica install failure. (I will retest it, but I'm pretty sure that it was clean VM, test for some reason install client first) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 295, in decorated func(installer) File /usr/lib/python2.7/site-packages/ipaserver/install/server/replicainstall.py, line 319, in install_check sys.exit(IPA client is already configured on this system.\n 2015-08-19T14:14:15Z DEBUG The ipa-replica-install command failed, exception: SystemExit: IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. 2015-08-19T14:14:15Z ERROR IPA client is already configured on this system. Please uninstall it first before configuring the replica, using 'ipa-client-install --uninstall'. Confirm I got same error. On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. 1) +# empty comment here (several times) Removed NACK you changed it wrong group() returns everything, you need use group(1)
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
I got this: https://paste.fedoraproject.org/256746/43999380/ On 08/19/2015 09:00 AM, Oleg Fayans wrote: Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. 1) +# empty comment here (several times) Removed NACK you changed it wrong group() returns everything, you need use group(1) to return content in braces. -- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Hi Martin, As discussed, here is a new version with pep8-related fixes On 08/14/2015 10:44 AM, Oleg Fayans wrote: Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. 1) +# empty comment here (several times) Removed NACK you changed it wrong group() returns everything, you need use group(1) to return content in braces. -- Oleg Fayans Quality Engineer FreeIPA team RedHat. From c7aecff2f7d09b33a5d806f43598373df79b4751 Mon Sep 17 00:00:00 2001 From: Oleg Fayans ofay...@redhat.com Date: Wed, 19 Aug 2015 08:57:29 +0200 Subject: [PATCH] Added integration tests for Topology plugin --- ipatests/test_integration/tasks.py | 101 ++--- ipatests/test_integration/test_topology.py | 143 ipatests/test_ipaserver/test_topology_plugin.py | 14 ++- 3 files changed, 236 insertions(+), 22 deletions(-) create mode 100644 ipatests/test_integration/test_topology.py diff --git a/ipatests/test_integration/tasks.py b/ipatests/test_integration/tasks.py index 2b83f274619fcb18bcb87118d7df35a85ce52c1a..2544502a692b3a818e489bd94d8651d46972fa60 100644 --- a/ipatests/test_integration/tasks.py +++ b/ipatests/test_integration/tasks.py @@ -40,6 +40,24 @@ from ipatests.test_integration.host import Host log = log_mgr.get_logger(__name__) +def check_arguments_are(slice, instanceof): + +:param: slice - tuple of integers denoting the beginning and the
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Hi Martin, Already noticed that. Implemented the named groups as Tomas advised. Added the third test for http://www.freeipa.org/page/V4/Manage_replication_topology/Test_plan#Test_case:_Removal_of_a_topology_segment_is_allowed_only_if_there_is_at_least_one_more_segment_connecting_the_given_replica On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. 1) +# empty comment here (several times) Removed NACK you changed it wrong group() returns everything, you need use group(1) to return content in braces. -- Oleg Fayans Quality Engineer FreeIPA team RedHat. From 50ff9ba1dfaac5f5c382b6900e791639cb6c7e3e Mon Sep 17 00:00:00 2001 From: Oleg Fayans ofay...@redhat.com Date: Fri, 14 Aug 2015 10:41:12 +0200 Subject: [PATCH] Added first part of integration tests for topology plugin --- ipatests/test_integration/tasks.py | 66 ++- ipatests/test_integration/test_topology.py | 143 ipatests/test_ipaserver/test_topology_plugin.py | 14 ++- 3 files changed, 215 insertions(+), 8 deletions(-) create mode 100644 ipatests/test_integration/test_topology.py diff --git a/ipatests/test_integration/tasks.py b/ipatests/test_integration/tasks.py index 2b83f274619fcb18bcb87118d7df35a85ce52c1a..ebdddf60c0b0e0fb662d0e5ee5c9ec55cb88559c 100644 --- a/ipatests/test_integration/tasks.py +++ b/ipatests/test_integration/tasks.py @@ -40,6 +40,23 @@ from ipatests.test_integration.host import Host log = log_mgr.get_logger(__name__) +def check_arguments_are(slice, instanceof): + +:param: slice - tuple of integers denoting the beginning and the end +of argument list to be checked +:param: instanceof - name of the class the checked arguments should be
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
On 08/13/2015 05:06 PM, Martin Basti wrote: On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. 1) +# empty comment here (several times) Removed NACK you changed it wrong group() returns everything, you need use group(1) to return content in braces. I'd suggest using named groups in this case, it leads to clearer expressions. See: https://docs.python.org/2/library/re.html , (?Pname...) section. -- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
On 08/11/2015 03:36 PM, Oleg Fayans wrote: Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. 1) +# empty comment here (several times) Removed NACK you changed it wrong group() returns everything, you need use group(1) to return content in braces. -- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. 1) +# empty comment here (several times) -- Martin Basti -- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. -- Oleg Fayans Quality Engineer FreeIPA team RedHat. From b3f008da590608af0ccbc363bec43523369b18dd Mon Sep 17 00:00:00 2001 From: Oleg Fayans ofay...@redhat.com Date: Tue, 11 Aug 2015 13:19:12 +0200 Subject: [PATCH] Added first part of integration tests for topology plugin --- ipatests/test_integration/tasks.py | 48 +- ipatests/test_integration/test_topology.py | 119 ipatests/test_ipaserver/test_topology_plugin.py | 13 +-- 3 files changed, 172 insertions(+), 8 deletions(-) create mode 100644 ipatests/test_integration/test_topology.py diff --git a/ipatests/test_integration/tasks.py b/ipatests/test_integration/tasks.py index 2b83f274619fcb18bcb87118d7df35a85ce52c1a..e14bc80ec8fd19641f0a4e4ec6c85953c301dd97 100644 --- a/ipatests/test_integration/tasks.py +++ b/ipatests/test_integration/tasks.py @@ -40,6 +40,13 @@ from ipatests.test_integration.host import Host log = log_mgr.get_logger(__name__) +def check_arguments_are_hosts(func): +def wrapped(*args): +for i in args: +assert isinstance(i, Host), Wrong type: %s: %s % (i, type(i)) +func(*args) +return(wrapped) + def prepare_host(host): if isinstance(host, Host): env_filename = os.path.join(host.config.test_dir, 'env.sh') @@ -243,7 +250,6 @@ def install_replica(master, replica, setup_ca=True, setup_dns=False): '--forwarder', replica.config.dns_forwarder ]) replica.run_command(args) - enable_replication_debugging(replica) setup_sssd_debugging(replica) @@ -507,7 +513,8 @@ def uninstall_master(host): paths.SYSCONFIG_PKI_TOMCAT, paths.SYSCONFIG_PKI_TOMCAT_PKI_TOMCAT_DIR, paths.VAR_LIB_PKI_TOMCAT_DIR, - paths.PKI_TOMCAT], + paths.PKI_TOMCAT, + paths.REPLICA_INFO_GPG_TEMPLATE % host.hostname], raiseonerr=False) unapply_fixes(host) @@ -519,6 +526,43 @@ def uninstall_client(host): raiseonerr=False) unapply_fixes(host) +@check_arguments_are_hosts +def clean_replication_agreement(master, replica): + +Performs `ipa-replica-manage del replica_hostname --force`. + +master.run_command(['ipa-replica-manage', 'del', replica.hostname, '--force']) + +@check_arguments_are_hosts +def create_segment(master, leftnode, rightnode): + +creates a topology segment. The first argument is a node to run the command on +:returns: a hash object containing segment's name, leftnode, rightnode information + +kinit_admin(master) +lefthost = leftnode.hostname +righthost = rightnode.hostname +segment_name = %s-to-%s % (lefthost, righthost) +result = master.run_command([ipa,
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Hi Martin, On 08/11/2015 02:02 PM, Martin Basti wrote: NACK, comments inline. On 11/08/15 13:25, Oleg Fayans wrote: Hi Martin, Thanks for the review! On 08/10/2015 07:08 PM, Martin Basti wrote: Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? My bad, fixed. still there +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of Fixed, sorry. 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... Fixed. Created a decorator that checks the type of arguments This does not scale well. If we will want to add new argument that is not host object, you need change it again. Agreed. Modified the decorator so that you can specify a slice of arguments to be checked and a class to compare to. This does scale :) This might be used as function with specified variables that have to be host objects 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found Fixed 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] Fixed 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) in fact leftnode_re.findall(string)[0] and leftnode_re.search(string).group(1), Are equally bad from the readability point of view. The first one is even shorter a bit, so why change? :) It depends on point of view, because when I reviewed it yesterday my brain raises exception that you are trying to add multiple values to single value attribute, because you used findall, I expected that you need multiple values, and then I saw that index [0] at the end, and I was pretty confused what are you trying to achieve. And because findall is not effective in case when you need to find just one occurrence. I got it. Fixed. Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) Done. 1) +# empty comment here (several times) Removed -- Oleg Fayans Quality Engineer FreeIPA team RedHat. From 3569551e68b4f02a0ea9161c47d8c1ec2bdbf041 Mon Sep 17 00:00:00 2001 From: Oleg Fayans ofay...@redhat.com Date: Tue, 11 Aug 2015 15:34:38 +0200 Subject: [PATCH] Added first part of integration tests for topology plugin --- ipatests/test_integration/tasks.py | 58 +++- ipatests/test_integration/test_topology.py | 115 ipatests/test_ipaserver/test_topology_plugin.py | 13 +-- 3 files changed, 178 insertions(+), 8 deletions(-) create mode 100644 ipatests/test_integration/test_topology.py diff --git a/ipatests/test_integration/tasks.py b/ipatests/test_integration/tasks.py index 2b83f274619fcb18bcb87118d7df35a85ce52c1a..44b9a78b8a82e721817251f6b0e0bc45a8145a2e 100644 --- a/ipatests/test_integration/tasks.py +++ b/ipatests/test_integration/tasks.py @@ -40,6 +40,23 @@ from ipatests.test_integration.host import Host log = log_mgr.get_logger(__name__) +def check_arguments_are(slice, instanceof): + +:param: slice - tuple of integers denoting the beginning and the end +of argument list to be checked +:param: instanceof - name of the class the checked arguments should be +instances of +Example: @check_arguments_are((1, 3), int) will check that the second +and third arguments are integers + +def wrapper(func): +def wrapped(*args): +for i in args[slice[0]:slice[1]]: +assert isinstance(i, instanceof), Wrong type: %s: %s % (i, type(i)) +func(*args) +return wrapped +return wrapper + def prepare_host(host): if isinstance(host, Host): env_filename =
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Thank you for patch, I have a few nitpicks: 1) On 10/08/15 13:05, Oleg Fayans wrote: +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) Why do you add the name of method in docstring? 2) +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + I would prefer to add assert there instead of just document that a Host object is needed assert(isinstance(master, Host)) ... 3) +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host Instead of description of params as first, second etc., you may use following: +def destroy_segment(master, segment_name): + +Destroys topology segment. +:param master: reference to master object of class Host +:param segment: name fo segment and eventually this in other methods +:returns: Lorem ipsum sit dolor mit amet +:raises NotFound: if segment is not found 4) cls.replicas[:len(cls.replicas) - 1], I suggest cls.replicas[:-1] In [2]: a = [1, 2, 3, 4, 5] In [3]: a[:-1] Out[3]: [1, 2, 3, 4] 5) Why re.findall() and then you just use the first result? 'leftnode': self.leftnode_re.findall(i)[0] Isn't just re.search() enough? leftnode_re.search(value).group(1) Python 3 nitpick: I'm not sure if time when we should enforce python 2/3 compability already comes, but just for record: instead of open(file, 'r'), please use io.open(file, 'r') (import io before) -- Martin Basti -- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code
Re: [Freeipa-devel] [PATCH] First part of integration tests for Topology Plugin
Last update to the patch. On 08/10/2015 09:41 AM, Oleg Fayans wrote: Hi all. Applied pPOP8 requirements to the code, removed unused imports. Please, disregard the first version of this patch On 08/10/2015 08:20 AM, Oleg Fayans wrote: Hi list, Here are 2 integration tests for topology plugin. Plus I got rid of using nose in test_ipaserver/test_topology_plugin.py: I am using @pytest.mark.skipif instead -- Oleg Fayans Quality Engineer FreeIPA team RedHat. From 595e9eb014d09c4f34e3d63a3889df6dfd503ea0 Mon Sep 17 00:00:00 2001 From: Oleg Fayans ofay...@redhat.com Date: Mon, 10 Aug 2015 13:03:20 +0200 Subject: [PATCH] Added first part of integration tests for topology plugin --- ipatests/test_integration/tasks.py | 40 +++- ipatests/test_integration/test_topology.py | 119 ipatests/test_ipaserver/test_topology_plugin.py | 12 +-- 3 files changed, 163 insertions(+), 8 deletions(-) create mode 100644 ipatests/test_integration/test_topology.py diff --git a/ipatests/test_integration/tasks.py b/ipatests/test_integration/tasks.py index 2b83f274619fcb18bcb87118d7df35a85ce52c1a..efd1c343d760ed16785b93de102270b80a0cec6f 100644 --- a/ipatests/test_integration/tasks.py +++ b/ipatests/test_integration/tasks.py @@ -243,7 +243,6 @@ def install_replica(master, replica, setup_ca=True, setup_dns=False): '--forwarder', replica.config.dns_forwarder ]) replica.run_command(args) - enable_replication_debugging(replica) setup_sssd_debugging(replica) @@ -507,7 +506,8 @@ def uninstall_master(host): paths.SYSCONFIG_PKI_TOMCAT, paths.SYSCONFIG_PKI_TOMCAT_PKI_TOMCAT_DIR, paths.VAR_LIB_PKI_TOMCAT_DIR, - paths.PKI_TOMCAT], + paths.PKI_TOMCAT, + paths.REPLICA_INFO_GPG_TEMPLATE % host.hostname], raiseonerr=False) unapply_fixes(host) @@ -519,6 +519,42 @@ def uninstall_client(host): raiseonerr=False) unapply_fixes(host) +def clean_replication_agreement(master, replica): + +clean_replication_agreement(master, replica): +Performs `ipa-replica-manage del replica_hostname --force`. +Both arguments should be objects of class Host + +master.run_command(['ipa-replica-manage', 'del', replica.hostname, '--force']) + +def create_segment(master, leftnode, rightnode): +create_segment(master, leftnode, rightnode) +creates a topology segment. The first argument is a node to run the command on +The first 3 arguments should be objects of class Host +Returns a hash object containing segment's name, leftnode, rightnode information + +kinit_admin(master) +lefthost = leftnode.hostname +righthost = rightnode.hostname +segment_name = %s-to-%s % (lefthost, righthost) +result = master.run_command([ipa, topologysegment-add, realm, segment_name, + --leftnode=%s % lefthost, + --rightnode=%s % righthost]) +return {'leftnode': lefthost, +'rightnode': righthost, +'name': segment_name} + +def destroy_segment(master, segment_name): + +destroy_segment(master, segment_name) +Destroys topology segment. First argument should be object of class Host + +kinit_admin(master) +return master.run_command([ipa, + topologysegment-del, + realm, + segment_name]) + def get_topo(name_or_func): Get a topology function by name diff --git a/ipatests/test_integration/test_topology.py b/ipatests/test_integration/test_topology.py new file mode 100644 index ..f4b24a4580c35b62cdb176d04db2dd91e59db9ab --- /dev/null +++ b/ipatests/test_integration/test_topology.py @@ -0,0 +1,119 @@ +# +# Copyright (C) 2015 FreeIPA Contributors see COPYING for license +# + +import re +import time +from ipatests.test_integration.base import IntegrationTest +from ipatests.test_integration import tasks + + +class TestTopologyOptions(IntegrationTest): +num_replicas = 2 +topology = 'star' +segname_re = re.compile(Segment name: ([\w\.\-]+)) +noentries_re = re.compile(Number of entries returned (\d+)) +leftnode_re = re.compile(Left node: ([\w\.]+)) +rightnode_re = re.compile(Right node: ([\w\.]+)) +connectivity_re = re.compile(Connectivity: ([\w\-]+)) + +@classmethod +def install(cls, mh): +tasks.install_topo(cls.topology, cls.master, + cls.replicas[:len(cls.replicas) - 1], + cls.clients) + +def tokenize_topologies(self, command_output): + +tokenize_topologies(command_output) +takes an output of `ipa topologysegment-find` and returns an array of +segment hashes + +segments =