Looks ok to me.

- Keith

On 03/15/10 02:48 PM, Clay.Baenziger at Oracle.COM wrote:
> Hi Keith,
>     My apologies for the wonky merge. I think the webrevs should be 
> fixed up now; same URLs:
> Differential webrev:
> http://cr.opensolaris.org/~clayb/11510/webrev4.diff/
>
> Full webrev:
> http://cr.opensolaris.org/~clayb/11510/webrev4/
>
>                             Thank you,
>                             Clay
>
> On Mon, 15 Mar 2010, Keith Mitchell wrote:
>
>> 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
>>>>>>
>>>>
>> _______________________________________________
>> caiman-discuss mailing list
>> caiman-discuss at opensolaris.org
>> http://mail.opensolaris.org/mailman/listinfo/caiman-discuss
>>

Reply via email to