Subject: Integrating OCF framework w/ (Net|Free)BSD rc.d
To: None <ocf@lists.community.tummy.com, freebsd-rc@freebsd.org,>
From: Brian A. Seklecki <lavalamp@spiritual-machines.org>
List: tech-userlevel
Date: 05/16/2006 13:35:51
What is OCF? The extensions required to make any RC script register a 
system service as a Cluster Resource in the Linux-HA infrastructure.

For those of you unfamiliar with OCF, please refer to the draft standard 
at: 
http://www.opencf.org/cgi-bin/viewcvs.cgi/specs/ra/resource-agent-api.txt?rev=HEAD
http://linux-ha.org/HeartbeatResourceAgent
http://linux-ha.org/LSBResourceAgent
http://linux-ha.org/OCFResourceAgent
http://linux-ha.org/ResourceAgentSpecs

Fortunately, our rc.d system infrastructure is sufficiently extensible in 
nature to easily mitigate the need for duplicate OCF script coding efforts 
by Port maintainers.  Existing in-tree and Ports-provided rc.d/ compliant 
scripts can be extended with very little effort.

However some discussion would be prudent as to how to best accomplish the 
task most conducive

==

*) Exit codes

We deviate slightly from LSB, as so does LSB from OCF.

Example: When we execute a "stop" command to run_rc_command() on an 
already stopped service, we return code "1", while OCF/LSB calls for code 
3.  We could put a conditional check around the return/exit statement, 
however OCF "compatibility mode" would need to be a variable we source in 
from the service's RC script.  like 'checkyesno $ofc_compat' at line 691 
in rc.subr

There are other adjustments to exit codes that would so need to be made 
(see the standards doc)

*) Environmental variables for per-instance services

Currently we don't have a uniform method for dealing with multiple 
instances of services.  The Apache2 method is nice ("Profiles"); -- 
"apache2.sh [instance] [argument]" syntax.  OCF scripts expect to be 
differentiate using exported environmental variables from the calling 
application: OCF_RESKEY_*, which is not an issue.

*) Additional arguments

The spec calls for additional arguments "monitor" (to augment the existing 
"status") as well as "metadata" (to describe the service using an XML DTD) 
and an optional "validate-all".

These can be very easily implemented using a $extra_commands="".

   extra_commands="monitor metadata"

   monitor_cmd="slapd_monitor"
   metadata_cmd="slapd_metadata"

Note: commands with hyphens (or function names) in them do not seem to be 
honored.  'monitor' should hypothetically be an intelligent service check, 
more than just checking if a TCP socket is open but also if the service is 
healthy -- which implies calling/exec'ing an outside program, like a 
Nagios health check.  Something that generates dynamic input and checks it 
against generated output.

Note: None of the included OCF examples do truely objective testing yet! 
(Sorry guys, systems that don't permitted fragmented packets to the 
network broadcast address aren't going to run Apache's mod_status by 
default }:> ).  We can leave the $servicename_monitor() symantics up to 
the port maintainer, plus the end user can always do more aggressive 
checking.

However, our current "status" routine checks for the existence of a PID 
file and cross-references it against the process list (which is a more 
extensive than most other RC systems).  Given that, as a temporary fix, 
"monitor" can be easily mapped to "status" using a small code snippit:

   slapd_monitor ()
   {
    run_rc_command status

    case $? in
           1)
                   exit 7
                   ;;
           *)
                   exit 0
                   ;;
           esac
   }

--

As for the "metadata" and "validate-all" routines, the XML DTD simply 
helps describe the command line and environmental variable arguments valid 
for the OCF service script, so we might be able to develop a reusable set 
of routines for generating the output without any crazy dependencies on 
libXML.

The trickier question arises when we want to start making in-tree rc.d/ 
scripts OFC compliant/compatible (nfsd, named, inetd, sendmail, ntpd, 
etc. come to mind)

I'm interested in any discussion / thoughts on a strategy or apporach for 
coding OCF compatibility / integration into our rc.d/ system

Thanks,

~BAS