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 >