The following comments are based on the differential webrev, although it 
appears that the differential webrev has a few oddities related to 
merging (e.g., the find_TFTP_root changes show up in the diff).

delete_service.py lines 207, 539, 565, 664, 711:
Were these reverted intentionally?
525 & 528: Print statements need cleaning

778: Not sure what's going on with this comment.

- Keith

On 03/12/10 06:43 PM, Clay.Baenziger at Oracle.COM wrote:
> Hi Keith,
>     I've made the correction you suggest as certainly it make much 
> more sense for the file objects to implement these functions but I've 
> also fixed bug 15175 "installadm delete-service can errantly error 
> about boot archives". So, I think you have roughly 6 lines of code to 
> please check and I'll finally get this off our plates.
>
> Differential webrev:
> http://cr.opensolaris.org/~clayb/11510/webrev4.diff/
>
> Full webrev:
> http://cr.opensolaris.org/~clayb/11510/webrev4/
>                             Thank you,
>                             Clay
>
>
> On Wed, 3 Mar 2010, Keith Mitchell wrote:
>
>> Hi Clay,
>>
>> Short version - the changes look good! (A few compliments and 
>> thank-you's below)
>>
>> One last question though: Seems like "is_readable" and "is_writeable" 
>> belong on the File_ and StringIO_ classes? (With FileMethods possibly 
>> implementing intelligent "defaults", i.e. writable returning False 
>> and readable returning True)
>>
>> (As a stylistic note, since they're properties and not plain methods, 
>> I would have called them "readable" and "writable")
>>
>> Thanks,
>> Keith
>>
>> On 03/ 2/10 03:29 PM, Clay Baenziger wrote:
>>> Hi Keith,
>>>     Thank you for this review! And your ability to remember and 
>>> catch small details is not annoying -- it's a God-send for someone 
>>> like me. My comments in-line. I've fixed your comments and added a 
>>> fix for a bug I found in installadm_common.py when running 
>>> delete-service as well:
>>> Differential webrev:
>>> http://cr.opensolaris.org/~clayb/11510/webrev3.diff
>>> Full Webrev:
>>> http://cr.opensolaris.org/~clayb/11510/webrev3
>>>
>>>                                 Thank you,
>>>                                 Clay
>>>
>>> On Tue, 2 Mar 2010, Keith Mitchell wrote:
>>>
>>>> Hi Clay,
>>>>
>>>> I have a few comments about these fixes.
>>>>
>>>> First, a meta-question about 14735 - is "SystemExit" truly the 
>>>> appropriate exception to be raising here, given that there's no 
>>>> intent to exit the Python interpreter? I believe SystemExit should 
>>>> only be raised with the intention of exiting the program, and that 
>>>> it should never be caught (unless re-raised). There must be a more 
>>>> appropriate exception to raise - if not, it's trivial to define one 
>>>> as needed.
>>>> http://docs.python.org/library/exceptions.html#exceptions.SystemExit
>>>
>>> I certainly feel SystemExit is more appropriate than SystemError. 
>>> However, the big case here of run_cmd() returning SystemExit should 
>>> issue its own exception. I have added an explicit call out for 
>>> run_cmd() in 4016 - A/I Python code error architecture should be 
>>> looked at for better reuse (i.e. in a different U/I). I would like 
>>> to avoid massive code changes in this bug due to schedule 
>>> constraints right now.
>>
>> Certainly SystemExit is better than SystemError! I definitely wasn't 
>> implying a reversal of the fix :) Adding the cases in question to bug 
>> 4016 seems like an appropriate action, given the time constraints. I 
>> do wonder at what point we can get away from SystemExit though. 
>> Perhaps I'll put my foot down a bit more after this release...
>>
>>>
>>>> create_client.py:
>>>> function: parse_options(): optparse.OptionParser defines a 
>>>> function, error(), which prints out a message and usage 
>>>> appropriately (as well as exiting). I think utilizing that 
>>>> functionality may be desired here, instead of manually raising 
>>>> SystemExits.
>>>
>>> I have changed to parser.error() thank you for pointing this out.
>>>
>>>> 99-100, 145: Please remove the commented out lines
>>>
>>> Thank you
>>>
>>>> 121: My count may be off, but if you follow PEP8 and remove the 
>>>> spaces around the '=' inside parentheses (keyword arguments 
>>>> shouldn't have the space around the '=' as I recall), then this 
>>>> fits on one line cleanly.
>>>
>>> Thank you, I've fixed the parenthesized " = "'s to "=" throughout 
>>> the file.
>>>
>>>> 150: Not related to your change, but this should be "...arch == 
>>>> 'SPARC':" instead of 'is' - technically, two equivalent strings 
>>>> don't have to be the same object.
>>>> (Ditto for line 274)
>>>
>>> Yes, relying on the class's hash function is a better way to go in 
>>> the face of later change.
>>>
>>>> 160: Nit/PEP8 - No spaces around '=' in keyword args.
>>>
>>> Thank you for the reminder
>>>
>>>> 295-311:
>>>> Seems like some of this hoop jumping could be avoided by having 
>>>> separate except clauses for SystemExit and 
>>>> com.AIImage.AIImageError. (The remainder of the hoop jumping would 
>>>> not be needed if we didn't abuse SystemExit instantiation by trying 
>>>> to pass in both a message and an error code in other parts of our 
>>>> code, and instead created a simple sub-class of SystemExit that had 
>>>> room for both if we really need it).
>>>
>>> Yes this hoop jumping was to deal with OptionParser exiting. If I 
>>> can let it handle all exit cases, it makes life easier.
>>
>> It looks much better now! :)
>>
>>>
>>>> 319: Why was this moved after the information about how to file a bug?
>>>
>>> This was done because otherwise the message says to see the 
>>> exception printed below which was actually printed above.
>>
>> Thanks, I see that now. I told you I sometimes can't read ;)
>>
>>>
>>>> installadm_common.py:
>>>> 65: Comment needs an update
>>>
>>> Ah thank you for the catch
>>>
>>>> Thanks,
>>>> Keith
>>>>
>>>> On 02/26/10 07:05 PM, Clay Baenziger wrote:
>>>>> Hi John,
>>>>>     Thank you for the feedback! My responses in-line.
>>>>> New webrev:
>>>>> http://cr.opensolaris.org/~clayb/11510/webrev2/
>>>>> Differential webrev:
>>>>> http://cr.opensolaris.org/~clayb/11510/webrev2.diff/
>>>>>
>>>>>                             Thank you,
>>>>>                             Clay
>>>>>
>>>>> On Wed, 24 Feb 2010, John Fischer wrote:
>>>>>
>>>>>> Clay,
>>>>>>
>>>>>> Lots of great work here.  A few comments/questions follow.
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> John
>>>>>>
>>>>>>
>>>>>> create_client.py
>>>>>>  It seems that mac_address/options.mac_address could be converted to
>>>>>>  a str(com.MACAddress(mac_address/option.mac_address)) once and then
>>>>>>  the converted string used within the remainder of the code.  Either
>>>>>>  in the setup_.... functions or in __main__.
>>>>>
>>>>> Good point. I've changed the options parsing code to store the 
>>>>> verified and processed MAC address string.
>>>>>
>>>>>>    153 def setup_tftp_links(service_name, image_path, 
>>>>>> mac_address, boot_args = "null"):
>>>>>>    166     client_id = "01" + str(com.MACAddress(mac_address))
>>>>>>
>>>>>>    175 def setup_sparc_client(image_path, mac_address):
>>>>>>    186     client_id = "01" + str(com.MACAddress(mac_address))
>>>>>>
>>>>>>    201 def setup_dhcp(mac_address, arch):
>>>>>>    212     client_id = "01" + str(com.MACAddress(mac_address))
>>>>>>
>>>>>>    267         if options.image.arch is "X86":
>>>>>>    268             if options.boot_args:
>>>>>>    269                 setup_tftp_links(options.service_name,
>>>>>>    270                                  options.image.path,
>>>>>>    271 str(com.MACAddress(options.mac_address)),
>>>>>>    272                                  
>>>>>> ",".join(options.boot_args)+",")
>>>>>>    273             else:
>>>>>>    274                 setup_tftp_links(options.service_name,
>>>>>>    275                                  options.image.path,
>>>>>>    276 str(com.MACAddress(options.mac_address)))
>>>>>>    277         else:
>>>>>>    278             setup_sparc_client(options.image.path,
>>>>>>    279 str(com.MACAddress(options.mac_address)))
>>>>>>    280
>>>>>>    281         setup_dhcp(str(com.MACAddress(options.mac_address)),
>>>>>>    282                    options.image.arch)
>>>>>>
>>>>>> installadm_common.py
>>>>>>  Why not have the __init__ for class AIImage setup the _arch 
>>>>>> after _path is
>>>>>>  checked/setup?  _dir_path is setup in the __init__.
>>>>>
>>>>> Though it happens right now we really only care about validation 
>>>>> and architecture, I see no reason to hard code checking the 
>>>>> architecture; it's cached on first hit. As I originally wrote this 
>>>>> code it handled far more in anticipation of create_client being 
>>>>> pythonized.
>>>>>
>>>>>>  nit Add sun4v to comment
>>>>>>
>>>>>>    106         # check if sun4u
>>>>>>    107         if os.path.isdir(os.path.join(self.path, 
>>>>>> "platform", "sun4u")) or \
>>>>>>    108            os.path.isdir(os.path.join(self.path, 
>>>>>> "platform", "sun4v")):
>>>>>>    109             self._arch = "SPARC"
>>>>>>    110             return self._arch
>>>>>
>>>>> Done
>>>>>
>>>>>>  nit Add comment since sun4u has comment
>>>>>>
>>>>>>    111         if os.path.isdir(os.path.join(self.path, 
>>>>>> "platform", "i86pc")) or \
>>>>>>    112            os.path.isdir(os.path.join(self.path, 
>>>>>> "platform", "amd64")):
>>>>>>    113             self._arch = "X86"
>>>>>>    114             return self._arch
>>>>>
>>>>> Done
>>>>>
>>>>>>  If line 203 is true then why does line 217 work?
>>>>>>
>>>>>>    203         # XXX MRO doesn't seem to like this: line = 
>>>>>> super(self.__class__, self).readline()
>>>>>>    204         if issubclass(self.__class__, file):
>>>>>>    205             line = file.readline(self)
>>>>>>    206         elif issubclass(self.__class__, StringIO.StringIO):
>>>>>>    207             line = StringIO.StringIO.readline(self)
>>>>>>    208         else:
>>>>>>    209             raise AssertionError("Unimplemented readline 
>>>>>> for the ancestor "
>>>>>>    210                                  "of %s." % self.__class__)
>>>>>>    211         while line:
>>>>>>    212             # apply newline function (either strip "\n" or 
>>>>>> leave as is)
>>>>>>    213             line = newlineFn(line)
>>>>>>    214             # loop to the next line if we have a comment 
>>>>>> or blank line and are
>>>>>>    215             # not returning such lines
>>>>>>    216             if commentFn(line) or blanklineFn(line):
>>>>>>    217                 line = super(self.__class__, self).readline()
>>>>>>    218                 continue
>>>>>>    219             return line
>>>>>
>>>>> This was rather puzzling but Keith turned out to be a star and 
>>>>> figured the secret out, I believe it was:
>>>>>
>>>>> At 203, line = super(self.__class__, self).readline() caused the 
>>>>> MRO (method resolution order) to reset for some reason causing 
>>>>> infinite recursion. While after isinstance/issubclass then the MRO 
>>>>> was set so that line 217 worked.
>>>>>
>>>>> The right answer, however, is that both super calls should be:
>>>>> line = super(FileMethods, self).readline()
>>>>>
>>>>> This, despite the FileMethods class having no ancestor with a 
>>>>> readline function (but all of its subclasses do). It works happily 
>>>>> and resolves the correct readline with no funky recursion.
>>>>>
>>>>>> On 02/23/10 02:01 PM, Clay Baenziger wrote:
>>>>>>> Hi all,
>>>>>>> I've written a bit of code to change out the create-client.sh shell
>>>>>>> script to a Python version. This gets us yet closer to a 100% 
>>>>>>> Python
>>>>>>> installadm(1). Please let me know what looks rough here; this is 
>>>>>>> only
>>>>>>> going back to the default branch of slim_source.
>>>>>>>
>>>>>>> Bugs:
>>>>>>> 11510 create-client: accepts a SPARC image path for an X86 
>>>>>>> service 12159
>>>>>>> create-client accepts non-existent service names
>>>>>>> 14735 delete-service: should use SystemExit instead of SystemError
>>>>>>> exception
>>>>>>>
>>>>>>> Webrev:
>>>>>>> http://cr.opensolaris.org/~clayb/11510/
>>>>>>>
>>>>>>> Thank you,
>>>>>>> Clay
>>>>>>> _______________________________________________
>>>>>>> caiman-discuss mailing list
>>>>>>> caiman-discuss at opensolaris.org
>>>>>>> http://mail.opensolaris.org/mailman/listinfo/caiman-discuss
>>>>>>
>>>>> _______________________________________________
>>>>> caiman-discuss mailing list
>>>>> caiman-discuss at opensolaris.org
>>>>> http://mail.opensolaris.org/mailman/listinfo/caiman-discuss
>>>>
>>

Reply via email to