[[TOC(Software/eAM/aI*, depth=3)]] == Inventory Aggregate Manager == The Inventory Aggregate Manager stores node configuration information in database with a custom [http://mytestbed.net/projects/omf/wiki/NewInventoryDesign database schema]. It can be interfaced via a rest API and is depended up by several services to answer questions like: * which disk should we boot off? * what is the name of the control interface? * which kernel and initramfs should the node boot during pxe phases? * what kind of network cards does this node have? In the Inventory AM, some of the configuration data is static and configured during the installation process (e.g. the control interface of a node). In contrast some configuration information is gathered via a live inventory collection process where the node is booted into a PRE-OS (pxelinux). While in the PRE-OS scripts on the node collection information about the nodes current configuration (e.g installed disk size, types of wireless cards). The current attribute list is: * CM_ip - Ipaddress of the Chassis Manager * CM_port - ??? * CM_type - Version number of the cmc associated with this node * INF_control_ip - IP address of the control Interface * INF_data_switch_port_id - Switch port number for the data interface * INF_default_disk - Disk path that node boots off * INF_max_frisbee_rate - maximum rate allowed for pushing images onto the disk * INF_pxe_image - Name of the boot file that tells pxelinux.bin which kernel and initramfs to download * INF_reset_timeout - time before we assumed the node failed to boot and then attempt a recovery by rebooting * INF_x_coor - X coordinate of the node (domain specific) * INF_y_coor - Y coordinate of the node (domain specific) * INV_check_in - Last time the node successfully completed an inventory * INV_cpu_bench - rudimentary CPU benchmark (prime factorization) for comparing node capabilities * INV_cpu_hz - CPU clock speed for identification * INV_cpu_type - Vendor identification string that name the CPU architecture * INV_fw_ping - Connectivity test of the control interface (pings the outbound gateway) * INV_hd_model - Vendor string that identifies the hard disk * INV_hd_size - Disk size reported by OS * INV_hd_sn - Disk Serial number as reported by OS (for identification purposes) * INV_mb_sn - Mother board Serial number as reported by OS (for identification purposes) * INV_memory - Node Memory Capacity as reported by OS * '''name - Fully qualified domain name of the node (this is the principal identifier)''' === Resources and Relationships === Resources are physical entities in a testbed that are assumed to be named with fully qualified domain name (fqdn) (for resources that can have one) or with arbitrary string (for resources that are not IP addressable)and can have any number of attributes. Resource can be in relation with any other resource with, so far, 2 types of relationships: ||= Type =||= Relationship =||= Description =|| || 1 || belong_to || The subject resource belongs to the object resource || || 2 || installed_in || The subject resource is installed in the object resource || Typically, type 1 is used to designate that the node belongs to a testbed, and type 2 for devices that are installed into a node (at the moment type of relationship is not used for any particular function by the inventory). To facilitate better classification, inventory services are using string based '''resource type'''. So far, defined resources types are: testbed, node and device (these types are only used by other services). ''' Attributes ''' Attributes are name-value pairs of strings. Attribute names are prefixed to support globbing. Attribute prefixes: * CM_ - Attributes used by the CMC AM ( CM_TYPE, CM_IP, CM_PORT, CM_USER_NAME, CM_PASSWORD ) * INF_ - Core infrastructure attributes used by the PXE and Frisbee service ( INF_CONTROL_IP ) * INV_ - Attributes gathered by the inventory process === Inventory Service Group === {{{ }}} ''' resource_add - Add Resource ''' {{{ Add resource name of the resource or fully qualified resource name type of the resource xml-encoded hash of resource parameters }}} ''' resource_delete - Delete Resource ''' This method deletes all resource attributes, but does not delete children resources. {{{ Remove set of resources set of resource names }}} ''' resource_list - List Resources ''' {{{ Get all available resources of given type that belongs to given parent resource with all attributes Fully qualified resource name Type name, currently suported testbed, node and device }}} ''' relation_add - Add Relationship Between Resources ''' {{{ Add relation between two resources parent resource name child resource name }}} ''' attribute_add - Add an attribute ''' {{{ Add attribute to resource Resource name Name of attribute Value of attribute }}} ''' attribute_delete - Delete an attribute ''' {{{ Delete all attributes matching attribute pattern for all nodes matching node name pattern (rn) Resource name or resource name pattern Attribute pattern }}} ''' attribute_modify - Modify an attribute value ''' {{{ Modify attribute's value Resource name Attribute name New value of attribute }}} ''' attribute_list - List attributes ''' {{{ Get node with names matching name pattern with attributes matching attribute name pattern and value matching attribute value pattern Set of resource names or resource name pattern Attribute name pattern Attribute value pattern }}} ''' attribute_listChildren - List attributes of children ''' {{{ Get node with names matching name pattern with child (device) attributes matching attribute name pattern and value matching attribute value pattern Set of resource names or resource name pattern Child attribute name pattern Child attribute value pattern }}} === Usage Examples === ''' Create testbed, add node to it and add basic attributes ''' {{{ # Define the testbed wget -qO- 'http://new.orbit-lab.org:5054/inventory/resource_add?name=sb10.orbit-lab.org&type=testbed' # Add a node wget -qO- 'http://new.orbit-lab.org:5054/inventory/resource_add?name=node1-1.sb10.orbit-lab.org&type=node' # Create the parent/child relationship between the testbed and the node wget -qO- 'http://new.orbit-lab.org:5054/inventory/relation_add?parent=sb10.orbit-lab.org&child=node1-1.sb10.orbit-lab.org' # Add basic attributes # CM is CM3 (mandatory) wget -qO- 'http://new.orbit-lab.org:5054/inventory/attribute_add?name=node1-1.sb10.orbit-lab.org&attribute=CM_type&value=3' # IP Address for this CM (mandatory) wget -qO- 'http://new.orbit-lab.org:5054/inventory/attribute_add?name=node1-1.sb10.orbit-lab.org&attribute=CM_ip&value=10.22.1.1' # IP Port for this CM (mandatory) wget -qO- 'http://new.orbit-lab.org:5054/inventory/attribute_add?name=node1-1.sb10.orbit-lab.org&attribute=CM_port&value=1' # Disk from the node boots (for imaging) wget -qO- 'http://new.orbit-lab.org:5054/inventory/attribute_add?name=node1-1.sb10.orbit-lab.org&attribute=INF_default_disk&value=/dev/sda' ... }}} ''' Replace inventory information ''' {{{ # First, delete all devices that belong to the node wget -qO- 'http://new.orbit-lab.org:5054/inventory/resource_delete?set=node1-1.sb10.orbit-lab.org-*' # Then delete all node level attributes collected by the inventory process wget -qO- 'http://new.orbit-lab.org:5054/inventory/attribute_delete?name=node1-1.sb10.orbit-lab.org&attribute=INV_*' # Add node level attribute wget -qO- 'http://new.orbit-lab.org:5054/inventory/attribute_add?name=node1-1.sb10.orbit-lab.org&attribute=INV_MB_ID&value=i7' # Add first device named "node1-1.sb10.orbit-lab.org-e0" (and add it to the node) wget -qO- 'http://new.orbit-lab.org:5054/inventory/resource_add?name=node1-1.sb10.orbit-lab.org-e0&type=device' wget -qO- 'http://new.orbit-lab.org:5054/inventory/relation_add?parent=node1-1.sb10.orbit-lab.org&child=node1-1.sb10.orbit-lab.org-e0' # Add attributes for the new device wget -qO- 'http://new.orbit-lab.org:5054/inventory/attribute_add?name=node1-1.sb10.orbit-lab.org-e0&attribute=INV_MAC_0&value=00:01:02:03:04:05' }}} === Installation and Configuration === The Frisbee AM (tools and services) is packaged in the omf-aggmgr-frisbee-5.4 package. It can be installed form the package repository with {{{ apt-get install omf-aggmgr-inventory-5.4 }}} Instructions on how to add the Orbit software repository to your list of apt-sources can be found [wiki:Documentation/kPackages#UsingtheOribtPackageRepository ​here]. Once installed the service is configured by TODO.