William Schumann wrote:
> [Would like to push to integrate with build 129, currently Tuesday, Dec
> 1. Pre-Thanksgiving review would be welcomed.]
> Requesting code review for iSCSI boot support in Caiman
>
> The first delivery of iSCSI support is for the Caiman Automated
> Installer. Only static configuration is supported by this code.
>
> Before Target Discovery, the AI manifest is read. If iSCSI target
> parameters are specified, they will be taken from the manifest.
> If not, dhcpinfo(1) is used to get the DHCP-supplied parameter
> Rootpath. If Rootpath specifies iSCSI, the iSCSI target parameters are
> taken from it.
>
> If the boot target is successfully mounted, it will be chosen as the
> install disk. Only x86 support has been tested. The mounting of the
> boot target is a new function of Target Discovery td_search_target() -
> the target is searched for and mounted, given input through an nvlist -
> in this case, the target is an iSCSI target. It is done in a
> generalized way so that other targets may be mounted in the future.
>
> After mounting the iSCSI target, the device name is automatically
> selected as the install disk target candidate. It must then pass any
> other criteria specified in the manifest to be the final target.
>
> http://defect.opensolaris.org/bz/show_bug.cgi?id=6590
> http://cr.opensolaris.org/~wmsch/bug-6590/
> Project page: http://hub.opensolaris.org/bin/view/Project+caiman/iSCSI+Boot
>
> Enables nwam service in repository database (instead of doing it through
> commands in /var/svc/profile/upgrade).
> Target Discovery enhanced to discover with user-specified input (here,
> iSCSI target parameters). New code module:
> td_iscsi.c:td_target_search(attribute list)
>
> Unit testing:
> - correct configuration
> -- varied use of optional parameters to check defaulting
>
> - incorrect configuration - should fail install
> -- missing required parameters
> -- failure to mount with specified parameters should fail install
>
> - repeat install manually running auto-install
> - regression test - still installs to local disk
>
> Known problems:
> - NWAM phase 0 - DNS config not correct on initial reboot - can be
> corrected manually, but easier just to reboot.
> - one Ultra 20 observed to hang system completely when idle if power
> management is enabled
>
> Kludge:
> - Passing parameters from AI to ICT very clunky and will be refactored
> soon, so employed interim technique: create a marker file,
> /tmp/.iccsi_boot, which will be present only for iSCSI boot cases.
>
> CHAP support is only partly coded here. Will be completed soon.
>
> Please include Bing Zhao, since he is responsible for libima-related
> coding. IMA stands for iSCSI management API.
>
> Also, I noticed that Bing did a direct struct-struct assignment. I
> haven't been using that feature, but it is supported by ANSI C, Sun
> Studio, and gcc.
> td_iscsi.c:
> 79 *oid = lhbaList->oids[0];
>
> William
>
> _______________________________________________
> caiman-discuss mailing list
> caiman-discuss at opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/caiman-discuss
Great Job William!
Many of my comments are nits or questions.
Joe
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
usr/src/cmd/auto-install/ai_manifest.rng 35 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
Issue/Question:
-----------------------
207 <element name="target_device_iscsi_target_ip">
208 <text/>
Would it be better fo use something more specific for IP address instead
of text? Maybe not but I thought I would ask you to think about it.
I Googled and found this for IPv4 addresses:
<datatype name="IP" source="string">
<pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3}
(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
<annotation>
<info>
Datatype for representing IP addresses. Examples,
129.83.64.255, 64.128.2.71, etc.
This datatype restricts each field of the IP address
to have a value between zero and 255, i.e.,
[0-255].[0-255].[0-255].[0-255]
Note: in the value attribute (above) the regular
expression has been split over two lines. This is
for readability purposes only. In practive the R.E.
would all be on one line.
</info>
</annotation>
</pattern>
</datatype>
Same issue with LUN:
212 <element name="target_device_iscsi_target_lun">
213 <text/>
Would it be better to devise something more specific for LUN representing
the 4 16 bit pieces that reflect a multilevel addressing scheme? Maybe not
but I thought I would ask you to think about it.
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
usr/src/cmd/auto-install/auto_install.c 60 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
Issue/Question:
-----------------------
48 #define ISCSI_BOOT_INDICATOR_FILE "/tmp/.iscsi_boot"
I think this is a good idea as it is consistent with /.autoinstall
and /.livecd but I was wondering why you put this one in "/tmp" instead
of "/".
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
usr/src/cmd/auto-install/auto_install.h 24 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
Nit/Issue/Question:
-----------------------
206 char diskiscsiname[MAXNAMELEN];
207 char diskiscsiip[MAXNAMELEN];
208 char diskiscsilun[MAXNAMELEN];
209 unsigned long diskiscsiport;
210 char diskiscsichapname[MAXNAMELEN];
211 char diskiscsichapsecret[MAXNAMELEN];
212 char diskiscsiinitiator[MAXNAMELEN];
I find these names difficult to read. How would you feel about adding
a random "_" here or there? ;)
e.g.:
206 char diskiscsi_name[MAXNAMELEN];
207 char diskiscsi_ip[MAXNAMELEN];
208 char diskiscsi_lun[MAXNAMELEN];
209 unsigned long diskiscsi_port;
210 char diskiscsi_chap_name[MAXNAMELEN];
211 char diskiscsi_chap_secret[MAXNAMELEN];
212 char diskiscsi_initiator[MAXNAMELEN];
Issue/Question:
-----------------------
Is MAXNAMELEN sufficiently accurate for these?
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
usr/src/cmd/auto-install/auto_parse.c 38 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
Nit: 187-> 224
-----------------------
Please add a CR above the consecutive ai_get_manifest_element_value()
invocations for readibility?
I found this a little hard to read and noticed the <CR> above
calls to ai_get_manifest_element_value elsewhere in the file
improved readibilty.
Nit/Issue/Question:
-----------------------
209 adi->diskiscsiport = strtoll(p, NULL, 0);
Should the expected format be described as a comment in ai_manifest.rng?
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
usr/src/cmd/auto-install/auto_td.c 231 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
Issue/Question:
-----------------------
471 char *diskiscsiname = "";
472 char *diskiscsiip = "";
473 char *diskiscsiporta = "";
...
475 char *diskiscsilun = "";
476 char *diskiscsiprotocol = "";
...
492 char rootpath[MAXPATHLEN] = "";
Wouldn't it be better to initialize there to (char*)NULL or NULL?
Issue/Question:
-----------------------
454 * Returns -1 if error encountered
455 * Returns 0 if no parameters found, which assumes no iSCSI boot
desired
456 * Attempts to mount using libima with iSCSI initiator
457 * Returns 0 and writes Solaris device name of iSCSI target if mounted
458 * Returns -1 if specified target not mounted successfully
Return of -1 and 0 are differently commented twice.
Issue/Question:
-----------------------
482 if (adi->diskiscsiname[0] == '\0' ^ adi->diskiscsiip[0] == '\0') {
Why are you using bitwise OR, ^ ? Shouldn't this be logical OR, || ?
Issue/Question:
-----------------------
510 if ((ret = pclose(pipe_fp)) != 0)
511 auto_log_print("Error in command to check DHCP "
512 "for iSCSI boot client. Command:%s\n", cmd);
...
If ret is -1 does ERRNO need to be checked?
Issue/Question:
-----------------------
Please confirm the "Parsing iSCSI Rootpath" logic.
546 *p++ = '\0';
547 diskiscsiip = p; /* IP */
548 if ((p = strchr(p, ':')) == NULL)
I think you are truncating p before you are done parsing it.
Issue/Question:
-----------------------
634 char mydevname[512]; /* size used in sscanf format */
Is there a better constant to user for mydevname instead of 512?
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
usr/src/lib/libict_pymod/ict.py 60 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
Issue:
-----------------------
1356 if os.path.exists(ISCSI_BOOT_INDICATOR_FILE):
self.ISCSI_INSTALL should be set in the constructor to be consistant
with:
338 self.LIVECD_INSTALL = False
339 self.AUTO_INSTALL = False
Issue:
-----------------------
1277 if status == 0:
if status == 0 is backwards from how this is handled throughout.
and add logging message before return ICT_SVCCFG_FAILURE
Suggestion:
1277 if status == 0:
1278 return 0
1279 return ICT_SVCCFG_FAILURE
Change to:
if status != 0:
prerror('Unexpected error issuing svccfg -f command.')
prerror('Failure. Returning: ICT_SVCCFG_FAILURE')
return ICT_SVCCFG_FAILURE
return 0
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
usr/src/lib/libtd/Makefile 4 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
Looks OK
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
usr/src/lib/libtd/td_api.h 30 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
Nit:
-----------------------
244 td_errno_t td_target_search(nvlist_t *);
Why was td_target_search inserted in the middle of the td_discoverXYZ
functions?
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
usr/src/lib/libtd/td_mg.c 36 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
Nit/Issue/Question:
-----------------------
684 switch (target_type) {
685 case TD_TARGET_TYPE_ISCSI_STATIC_CONFIG:
Is a switch for a single case better than an "if" statement here?
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
New usr/src/lib/libtd/td_iscsi.c 572 lines changed
+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=
General Nit/Issue:
-----------------------
Please provide more extensive function block comments.
Good examples can be found in td_mountall.c
Nit/Issue:
-----------------------
57 * return 0: success
58 * 1: failure
-1, not 1, is returned on error
Suggestion:
57 * return 0: success
58 * !0: failure
Question:
-----------------------
136 (void) sprintf(targetIpaddr, "%s:%lu", ipaddress, port);
137
138 (void) mbstowcs(staticConfig.targetAddress.hostnameIpAddress.
139 id.hostname, targetIpaddr, IMA_HOST_NAME_LEN);
Does this work for both IPv4 and IPv6 ?
Nit:
-----------------------
238 * Wait fro a while here for updating.
fro -> for
Issue/Question:
-----------------------
240 (void) sleep(INSTISCSI_SLEEP_INTERVAL * 2);
How is it known this length of sleep will be sufficient.
Issue/Question:
-----------------------
433 (void) nvlist_lookup_uint32(attrs, TD_ISCSI_ATTR_PORT, &port);
448 (void) nvlist_lookup_string(attrs, TD_ISCSI_ATTR_LUN,
&lun_num);
Why isn't the return of nvlist_lookup_uint32/sting checked here?
General Questions:
- iSCSI only supported in AI why not LiveCD?
- Shouldn't test_td.c be updated to support td_iscsi?