Abstract:
In one aspect, a method includes receiving a request to provision a resource in a data storage system, determining whether any one of a set of quotas will be exceeded if the resource is provisioned, denying the request to provision the resource if any one of a set of quotas is exceeded and enabling the resource to be provisioned if none of the set of quotas is exceeded.

Description:
BACKGROUND 
     Computer systems are constantly improving in terms of speed, reliability, and processing capability. As is known in the art, computer systems which process and store large amounts of data typically include a one or more processors in communication with a shared data storage system in which the data is stored. The data storage system may include one or more storage devices, usually of a fairly robust nature and useful for storage spanning various temporal requirements (e.g., disk drives). The one or more processors perform their respective operations using the storage system. Mass storage systems (MSS) typically include an array of a plurality of disks with on-board intelligence and communications electronics and software for making the data on the disks available. 
     Companies that sell data storage systems and the like are very concerned with providing customers with an efficient data storage solution that minimizes cost while meeting customer data storage needs. It would be beneficial for such companies to have a way for reducing the complexity of implementing data storage. 
     SUMMARY 
     In one aspect, a method includes receiving a request to provision a resource in a data storage system, determining whether any one of a set of quotas will be exceeded if the resource is provisioned, denying the request to provision the resource if any one of a set of quotas is exceeded and enabling the resource to be provisioned if none of the set of quotas is exceeded. 
     In another aspect, an apparatus includes electronic hardware circuitry configured to receive a request to provision a resource in a data storage system, determine whether any one of a set of quotas will be exceeded if the resource is provisioned, deny the request to provision the resource if any one of a set of quotas is exceeded and enable the resource to be provisioned if none of the set of quotas is exceeded. 
     In a further aspect, an article includes a non-transitory computer-readable medium that stores computer-executable instructions. The instructions cause a machine to receive a request to provision a resource in a data storage system, determine whether any one of a set of quotas will be exceeded if the resource is provisioned, deny the request to provision the resource if any one of a set of quotas is exceeded and enable the resource to be provisioned if none of the set of quotas is exceeded. 
    
    
     
       BRIEF DESCRIPTION OF THE DRAWINGS 
       Objects, features, and advantages of embodiments disclosed herein may be better understood by referring to the following description in conjunction with the accompanying drawings. The drawings are not meant to limit the scope of the claims included herewith. For clarity, not every element may be labeled in every figure. The drawings are not necessarily to scale, emphasis instead being placed upon illustrating embodiments, principles, and concepts. 
       Thus, features and advantages of the present disclosure will become more apparent from the following detailed description of exemplary embodiments thereof taken in conjunction with the accompanying drawings in which: 
         FIG. 1  is a simplified block diagram of an example of a data storage device; 
         FIG. 2  is a simplified block diagram of another example of a data storage system; 
         FIG. 3  is a simplified flow chart of an example of a process to provision a resource using a quota in the data storage system in  FIG. 2 ; and 
         FIG. 4  is a simplified block diagram of an example of a computer on which any of the process of  FIG. 3  may be implemented. 
     
    
    
     Like reference symbols in the various drawings indicate like elements. 
     DETAILED DESCRIPTION 
     In certain embodiments, the current disclosure may enable a distributed software control platform that allows enterprise IT departments and cloud service providers to convert heterogeneous storage systems within a data center into one large storage array. In some embodiments, the current disclosure may enable exposure of logical storage resources and allow enterprise IT departments and cloud service providers to manage heterogeneous storage environments through a simple, robust Representational State Transfer (REST) API and a command-line interface (CLI). In at least one embodiment, one API and one CLI may be used to connect to all the storage arrays in a data center as if they were one large storage array. 
     In some embodiments, the current disclosure may enable a software platform for multi-tenant environments that delivers a single logical, cloud-scale, geo-distributed storage system for developers and storage/cloud administrators. In certain embodiments, the current disclosure may enable an enterprise to adopt hybrid management models in environments where storage infrastructure resides in enterprise data centers, but is also hosted by a service provider or a public cloud. In certain embodiments, the current disclosure may enable an enterprise to manage hybrid deployments as a single storage array. In further embodiments, the current disclosure may enable a data storage system to scale to millions of storage volumes and file shares. In still further embodiments, the techniques and implementations described herein may be deployed as a vApp, a set of virtual machines. 
     In certain embodiments, the current disclosure may enable data-centric cloud infrastructures to be managed efficiently and flexibly through a data management software platform. In some embodiments, the current disclosure may simplify the management of complex, heterogeneous, geo-distributed storage resources by exposing the storage systems as logical resources through robust, easy-to-use REST API and CLI interfaces. In most embodiments, the current disclosure may provide integrations into cloud stacks such as VMWARE® and OPENSTACK®. 
     In certain embodiments, the following definitions may be useful: 
     A data service may be a service for receiving, processing, storing, and protecting data. In certain embodiments, data services provide the high-level data and storage management capabilities of the system. 
     A control path may be a way to establish and control access to the data. 
     A data path may be the path the data takes from data storage provider to data storage consumer. 
     A storage medium may be any medium that is capable of storing data, including, but not limited to a storage array, a storage cluster, a physical disk, a virtual disk, and a virtual storage system. 
     A tenant may represent an organization operating within a data storage system. In some embodiments, a tenant may be generated in the system for the purposes of security isolation. 
     A neighborhood may represent a fault domain within a network. In many embodiments, a plurality of data centers may be combined to generate a federation. In some embodiments, the federation failures may occur that may affect the availability of resources. In certain embodiments, the data centers or federation may account for the failures by segmenting the infrastructure into different fault domains. In some embodiments, each fault domain may be designed to be isolated from other fault domains, while part of the same data center, so that each failure within one fault domain does not affect other fault domains. 
     A transport zone may represent a region of connectivity within a neighborhood. In many embodiments, a transport zone may include a network, such as a SAN network or an IP network. In various embodiments, a transport zone may include addresses (such as a World Wide Names (WWN) that may be in the network for both hosts and storage array ports. In some embodiments, addresses for hosts may include initiator addresses and/or IP addresses. In certain embodiments, a data storage system may be enabled to determine what initiators may be connected to what storage ports by analyzing a transport zone. 
     An initiator is a hardware interface that connects a host to a Storage Network for the purpose of accessing data stored in the Storage System. In many embodiments, an initiator may include a Fiber Channel (FC) initiator and/or an iSCSI initiator. In various embodiments, FC initiators may use a WWN address as a unique identifier in a data storage system. In various embodiments, a WWN may include a port address and/or node address. In certain embodiments, an iSCSI initiator may include addresses of type IQN and EUI. 
     An engine may be a hardware unit within a Symmetrix Array. In various embodiments, a VMAX system may include eight engines, where each engine may include two directors. 
     A director may be a hardware unit within a Symmetrix Array, on an engine. In some embodiment, each director may include one or more ports. 
     A project may be a resource organization abstraction that maps resources to applications, virtual data centers, departments, or other entities. In some embodiments, a user may generate their own projects, and may associate multiple resources from different data services with the projects. In most embodiments, resources from one project maybe shared between users under the same tenant. 
     A Class of Service may represent high-level capabilities and services that may be generated by administrators through composition of resource attributes and quality of services, including level of protection, availability, access protocol, performance, and additional storage/data services, such as versioning/snap, backup, remote replication, data reduction, encryption, and/or other data storage services. In many embodiments, users or tenants may select from a menu of Class of Service entries when generating a volume. 
     Generally, a data storage array or system may be one or more physical boxes or a cluster of physical boxes. In conventional systems, the data storage array or system may have one control path and one or more data paths. In typical systems, one or more data paths ports may provide data path access to the storage resources contained within the storage system. Typically, the protocols for the data path ports may be fiber channel, Internet Protocol (IP), iSCSI, NFS, or CIFS. Usually, to add more capacity to a data storage array or system, more physical disks, more inline cards, or more CPUs may be added to the data storage array or system. Conventionally, the data storage system or array may be a cluster of storage mediums. Typically, providing management for large numbers of data storage arrays or systems may be challenging. 
     Referring to  FIG. 1  a storage device  110  includes a control path  115 , ports  120 , and disks  125 ,  130 ,  135  and  140 . Control path  115  enables a user to interface with storage device  110 . Control path  115  enables a user to access disks  125 ,  130 ,  135  and  140 , via the services storage device  110  offers, through one or more of ports  120 . 
     In many embodiments, the current disclosure may enable allocation of storage ports for exporting volumes from storage arrays in a data storage system. In various embodiments, the current disclosure may eliminate the need for an administrator to manually allocate each storage port. In some embodiments, the current disclosure may maximize hardware redundancy between selected allocated paths by applying prioritized filtering of the candidate ports based on their hardware redundancy information. In certain embodiments, an arbitrary number of filters may be applied according to importance. For example, in an embodiment, a higher importance filter may be applied before a lower importance filter. In many embodiments, the current disclosure may enable automatic allocation of storage ports in one or more configurations. In various embodiments, the current disclosure may enable balanced usage and/or allocation of ports from a data storage array. In some embodiments, the current disclosure may determine a usage metric that is used to give allocation preference to ports that are less utilized than other ports. 
     In many embodiments, the current disclosure may enable optimized port selection for maximum redundancy which may consider both the data storage system, which may include the data storage array and the SAN fabric. In various embodiments, the current disclosure may enable load balancing across one or more data storage ports within a data storage system. In certain embodiments, the current disclosure may enable a user or administrator to dedicate one or more data storage ports for specific uses, such as a specified export group or project. 
     In many embodiments, the current disclosure may enable a port provisioning system to be implemented within a data storage system to enable allocation of storage ports for exporting volumes from storage arrays in a data storage system. In various embodiments, the port provisioning system may automatically adapt to a given configuration (i.e., a configuration which may include one or more SAN switches, one or more directors, one or more engines, one or more initiators, and/or one or more ports). In certain embodiments, the port provisioning system may automatically adapt to one or more network topologies. In some embodiments, a port provisioning system may be enabled to work with odd numbering of hardware, such as three directors, and may enable cycling through each director before reuse. In certain embodiments, the port provisioning system may allocate up to all ports that are available, across all switches, directors, and engines. In other embodiments, the port provisioning system may work well with symmetric configurations, such as two engines, each containing two directors, each connected to two SAN Switches. 
     In many embodiments, an automated provisioning system for storage arrays may be needed to pick and/or allocate storage ports on a storage array within a data storage system. In various embodiments, an automated provisioning system may be enabled to mask one or more ports to an export group, such that the ports may be used to access one or more desired storage volumes within the data storage system. In some embodiments, zones may be generated on a SAN switch which may allow a host to access storage array ports through the SAN fabric. In many embodiments, a storage port selection algorithm may take several considerations into account to optimize high availability, provide required bandwidth to the volume(s) by allocating a proportionate number of ports and to balance the load across the available storage ports. 
     In various embodiments, a data storage system may include one or more internal constructs and hardware to facilitate giving access to one or more volumes to one or more hosts. In certain embodiments, the one or more internal constructs and hardware may include switches, SAN switches, initiators, directors, engines, and/or storage ports. In many embodiments, a data storage system may include one or more data storage arrays which may be enabled to connect to one or more hosts. In some embodiments, one or more data volumes maybe allocated from one or more data storage arrays for one or more hosts. In other embodiments, a host may have one or more initiators having one or more ports enabled to connect a data storage volume. In many embodiments, a host initiator port may connect to a switch which may enable communication with a data storage volume on a data storage array in a data storage system. In various embodiments, each data storage array may enable access to a data storage volume through one or more ports. In some embodiments, a data storage array may include one or more engines, wherein each engine may include one or more directors. In certain embodiments, each director may include one or more ports which may enable access to one or more data volumes on a data storage array within a data storage system. In other embodiments, a data storage system may use other constructs and hardware to facilitate communication with data volumes within a data storage system. 
     In many embodiments, a port provisioning system may utilize one or more inputs to determine which ports are selected within a data storage system and allocated to a host. In some embodiments, a port provisioning system may receive Tenant Data, Administrative Data, and/or System Calculated Data. In various embodiments, Tenant Data may include data pertaining to one or more hosts requesting data services from the data storage system. In some embodiments, Tenant Data may include the number of initiators on a host. In certain embodiments, Tenant Data may include the port and node name of each host initiator. In an embodiment, the node name may include a worldwide name (WWN) of a node. In some embodiments, Tenant Data may include an iSCSI IQN or EUI address of a host initiator. In many embodiments, Tenant Data may include a specified Class of Service. Max_paths represents the maximum number of paths that will be provisioned for a host. In some embodiments, a Class of Service may include and/or imply a max_path value in the data storage system. In various embodiments, the paths_per_initiator represents the number of paths from a host initiator to storage. 
     In many embodiments, administrative data may include storage port registration status. In various embodiments, storage port registration status may specify which storage ports may be used by the data storage system. In certain embodiments, administrative data may include whether automated zoning may be enabled. In some embodiment, a data storage system may include one or more neighborhoods. In other embodiments, the current disclosure may enable a data storage system to automatically generate connectivity when storage volumes are exported or exposed for consumption. In certain embodiments, automatic zoning of the SAN fabric, i.e., network connectivity of certain components, when storage volumes are exported within a neighborhood may be performed. 
     In many embodiments, a data storage system may calculate system data which may be used by the port provisioning system. In various embodiments, system data may include and identify relevant transport zones, neighborhoods, candidate storage ports, redundancy groups, host connected switches, storage connected switches, and/or initiator-target communication ability. In certain embodiments, each host initiator may identify a transport zone connected to a data storage system. In various embodiments, each transport zone may be equivalent to a fiber channel fabric, a VSAN, an IP network, or other network type. In some embodiments, a transport zone may identify a set of potential host initiators and storage ports that may be zoned together enabling communication between them. 
     In many embodiments, each volume within a data storage system may identify and/or reside within a neighborhood in the data storage system. In various embodiments, a neighborhood may define a data center boundary within a data storage system. In certain embodiments, each transport zone may be contained within a specific neighborhood in a data storage system. 
     In other embodiments, each transport zone that may be used may identify a candidate set of storage ports and initiators within each respective transport zone that may be used together. In certain embodiments, a data storage system may determine a candidate set of storage ports based on storage ports that a system administrator registered in a given transport zone. In various embodiments, one or more data storage volumes may be connected to one or more hosts where the host initiators are in the same transport zone as the storage ports associated with the one or more data storage volumes. In various embodiments, a port provisioning system may use a candidate set of storage ports to export one or more data storage volumes to a host through a specified transport zone. In some embodiments, a host may be enabled to communicate with multiple transport zones, for example a host may have a first initiator in a first transport zone and a second initiator in a second transport zone. In various embodiments, a host may be enabled to communicate through two or more transport zones which may enable hardware redundancy when generating data paths from the host to the one or more data storage volumes. 
     In many embodiments, a data storage system may include one or more redundancy groups which may give the data storage system knowledge of hardware redundancy within the data storage system. In various embodiments, storage ports on a data storage system may be divided into one or more redundancy groups based on whether each port is implemented by separate hardware components. In some embodiments, storage ports in the same redundancy group may share components making these ports more likely to fail together. In other embodiments, redundancy groups may group ports by Engine, Director, slot number used, storage port name, and/or other storage port identifiers. In various embodiments, one or more redundancy groups may be used by the port provisioning system to enable allocation of ports in a manner to ensure that a one or more failures within a data storage system may not affect an overall stability and/or overall functionality of the data storage system. In other embodiments, one or more redundancy groups may be used by the port provisioning system to enable allocation of ports in a manner to ensure that a one or more failures within a data storage system may not affect the ability of a host to access a data storage volume from the data storage system. 
     In many embodiments, system data may include information on switch and communication availability between each host and data volumes allocated for each host. In some embodiments, system data may include each switch a host may be connected to. In certain embodiments, each host initiator may identify a SAN switch that is directly connected to the host. In other embodiments, system data may include each switch a storage port on a storage array may be connected to. In various embodiments, each candidate storage port may identify a switch that is directly connected to a storage port on a storage array. In many embodiments, system data may include information pertaining to initiator-target communication ability. In various embodiments, the existence of an initiator name and a target name in the same network or a network&#39;s database entries may indicate that the initiator and target may be able to communicate with each other. 
     In many embodiments, the current disclosure may enable a data storage system to allocate one or more ports for a single fiber channel and/or iSCSI transport zone using a port provisioning system. In various embodiments, if ports for multiple transport zones may be selected, a data storage system may use a port provisioning system to analyze each transport zone individually. In some embodiments, a port provisioning system may receive one or more inputs to make a determination of an efficient port allocation for a host utilizing data services in a data storage system. In certain embodiments, a port provisioning system may use tenant provided data, administrator provided data, and/or system calculated data. 
     In many embodiments, a port provisioning system may use tenant provided data, administrator provided data, and/or system calculated data to facilitate port allocation. In various embodiments, a port provisioning system may utilize one or more actions to determine an efficient allocation of ports for a data storage system. In some embodiments, a port provisioning system may enable a balanced allocation of storage ports throughout a data storage system. In various embodiments, a balanced allocation of storage ports may include a data storage system where each hardware component may allocate a similar number of storage ports across each hardware component. For example, in an embodiment, a data storage system allocating four ports through two engines would allocate two ports on each engine in the data storage system. In some embodiments, a balanced allocation of storage ports may mean an equal, or as close to equal, distribution of storage ports across each hardware component within the data storage system. In certain embodiments, a port provisioning system may be enabled to allocate storage ports based on one or more criteria. In many embodiments, a data storage system may include a data storage array including one or more data storage ports. In various embodiments, a data storage system may include a data storage array including one or more engines having one or more directors, having one or more data storage ports. In many embodiments, a port provisioning system may be enabled to generate a balanced allocation of data storage ports based on the configuration of the data storage system. In various embodiments, a port provisioning system may be enabled to generate a balanced allocation of data storage ports based on one or more levels of hardware components having data storage ports. 
     In many embodiments, a port provisioning service may determine available storage ports within a data storage system. In certain embodiments, a port provisioning system may verify that each available storage port is available through switches connected to a data storage system. In other embodiments, if a storage port is not available through a switch connected to a data storage system, a port provisioning system may remove the port from the list of available storage ports within the data storage system. 
     In some embodiments, a port provisioning system may be configured to balance ports across each hardware component type within a data storage system. In some embodiments, hardware may include one or more switches, one or more engines, one or more directors, or one or more ports. In certain embodiments, as a port provisioning system allocates ports, the port provisioning system may eliminate each piece of hardware used until all available hardware has been used. 
     In many embodiments, a port provisioning system may utilize one or more algorithms to analyze a data storage system and filter available data storage ports to determine a balanced and/or equal usage of ports across a given data storage system. In various embodiments, a port provisioning system may query a data system to determine which switches are available and which ports are connected to each available switch. In some embodiments, if a port is not currently connected to a switch, the port may be eliminated from the list of available ports. In certain embodiments, a port provisioning system may keep track of allocated ports, allocated engines, allocated directors, and/or allocated switches used while allocating ports to enable port provisioning system to allocate ports to maximize redundancy across each engine, director, and/or switch rather than allocating each port on a single entity. 
     In some embodiments, a port provisioning system may be enabled to allocate one or more available ports by filtering the available ports to enable a determination of a balanced and/or equal distribution of ports across each engine, director, and/or switch. In various embodiments, one or more filters may be applied in a precedence order from most important to least important consideration. In certain embodiments, the number of filters used may be adjusted. In many embodiments, a port provisioning system may use one or more filters, where each filter may operate on a data storage system entity, such as a VMAX engine, VMAX director, VNX processor, SAN switch, and/or other data storage system component. In some embodiments, each filter may require inputs, including: a current list of candidate ports, the filtering entities that have already been allocated or used, and a map from the contextual object that contains entries of an entity based on a key to the set of storage ports hosted by or associated with the entity. In many embodiments, as a port provisioning system starts allocating ports, each of the filters may have no allocated entities. In some embodiments, as the port provisioning system allocates ports, the port provisioning system includes the entities, from where the port was allocated, into its respective filter. In certain embodiments, the port provisioning system may continue to allocate ports while continually filtering out available ports using the specified filters. In some embodiments, once all entities are contained within each specified filter and no ports are available, each filter may be purged and the process repeated until the requested number of ports may be allocated. 
     Referring to  FIG. 2 , API Service  215  enables external access for Host  212  through API  205 . API Service  215  communicates requests to One Big Array  210 . API Service  215  enables access to Service Coordinator  275 , which enables access to other services and management modules. Through Service Coordinator  275 , API Service  215  has access to tenant manager  220 , catalog manager  225 , metering manager  230 , monitoring manager  235 , data services  240 , meta data service  250 , job service  255 , authn/authz  260 , log service  265 , messaging/eventing  270 , port provisioning  224 , placement scheduler  222 , and BIOS Controller Device  280 . As shown, port provisioning  224  allocates data storage ports for data storage volumes allocated from attached data storage. In this embodiment, attached data storage includes VNX storage array  282 , VMAX storage array  284 , Isilon storage array  286 , GreenPlum storage array  288 , and NetApp storage array  290 . 
     Referring to  FIG. 3 , an example of a process to provision a resource using a quota in the data storage system  210  is a process  300  performed by the API service  215 , for example. Process  300  is used to validate provisioning requests against abstract resources assigned for abstract entities (project, tenant, virtual pool). Each of the abstract entities may have a quota assigned by system administrator. For example, there is a tenant quota (i.e., a tenant is limited by a quota), a project quota (i.e., a project is limited by a quota) and a virtual pool quota (i.e., a virtual pool (class of service) is limited by a quota). 
     Process  300  receives a request to provision a resource ( 302 ). For example, a request is made by a user to provision one of capacity, bandwidth, processing time and other known resources. 
     Process  300  determines amount of quota remaining for a virtual pool quota ( 306 ) and determines if allowing the request will exceed the remaining virtual pool quota ( 312 ). If allowing the request will exceed the remaining virtual pool quota, process  300  denies the request to provision the resource ( 314 ) and process  300  ends. 
     If allowing the request will not exceed the remaining virtual pool quota, process  300  determines amount of quota remaining for a project quota ( 316 ) and determines if allowing the request will exceed the remaining project quota ( 322 ). If allowing the request will exceed the remaining project quota, process  300  denies the request to provision the resource ( 314 ) and process  300  ends. 
     If allowing the request will not exceed the remaining project quota, process  300  determines amount of quota remaining for a tenant quota ( 326 ) and determines if allowing the request will exceed the remaining tenant quota ( 332 ). If allowing the request will exceed the remaining tenant quota, process  300  denies the request to provision the resource and process  300  ends. If allowing the request will not exceed the remaining tenant quota, process  300  allows the request to provision the resource ( 336 ) and process  300  ends. 
     While the quotas in process  300  were evaluated in a particular order (virtual pool quota, project quota and tenant quota), one of ordinary skill in the art may use another order. 
     Referring to  FIG. 4 , one example of the API service  215  is the API service  215 ′. The API service  215 ′ is a computer that includes a processor  402 , a volatile memory  404 , a non-volatile memory  406  (e.g., hard disk) and the user interface (UI)  408  (e.g., a graphical user interface, a mouse, a keyboard, a display, touch screen and so forth). The non-volatile memory  406  stores computer instructions  412 , an operating system  416  and data  418  including virtual pool quota  422 , project quota  424  and tenant quota  426 . In one example, the computer instructions  412  are executed by the processor  402  out of volatile memory  404  to perform all or part of the processes described herein (e.g., process  300 ). 
     The processes described herein (e.g., process  300 ) are not limited to use with the hardware and software of  FIG. 4 ; they may find applicability in any computing or processing environment and with any type of machine or set of machines that is capable of running a computer program. The processes described herein may be implemented in hardware, software, or a combination of the two. The processes described herein may be implemented in computer programs executed on programmable computers/machines that each includes a processor, a non-transitory machine-readable medium or other article of manufacture that is readable by the processor (including volatile and non-volatile memory and/or storage elements), at least one input device, and one or more output devices. Program code may be applied to data entered using an input device to perform any of the processes described herein and to generate output information. 
     The system may be implemented, at least in part, via a computer program product, (e.g., in a non-transitory machine-readable storage medium such as, for example, a non-transitory computer-readable medium), for execution by, or to control the operation of, data processing apparatus (e.g., a programmable processor, a computer, or multiple computers)). Each such program may be implemented in a high level procedural or object-oriented programming language to communicate with a computer system. However, the programs may be implemented in assembly or machine language. The language may be a compiled or an interpreted language and it may be deployed in any form, including as a stand-alone program or as a module, component, subroutine, or other unit suitable for use in a computing environment. A computer program may be deployed to be executed on one computer or on multiple computers at one site or distributed across multiple sites and interconnected by a communication network. A computer program may be stored on a non-transitory machine-readable medium that is readable by a general or special purpose programmable computer for configuring and operating the computer when the non-transitory machine-readable medium is read by the computer to perform the processes described herein. For example, the processes described herein may also be implemented as a non-transitory machine-readable storage medium, configured with a computer program, where upon execution, instructions in the computer program cause the computer to operate in accordance with the processes. A non-transitory machine-readable medium may include but is not limited to a hard drive, compact disc, flash memory, non-volatile memory, volatile memory, magnetic diskette and so forth but does not include a transitory signal per se. 
     The processes described herein are not limited to the specific examples described. For example, the process  300  is not limited to the specific processing order of  FIG. 3 , respectively. Rather, any of the processing blocks of  FIG. 3  may be re-ordered, combined or removed, performed in parallel or in serial, as necessary, to achieve the results set forth above. 
     The processing blocks (for example, in the process  300 ) associated with implementing the system may be performed by one or more programmable processors executing one or more computer programs to perform the functions of the system. All or part of the system may be implemented as, special purpose logic circuitry (e.g., an FPGA (field-programmable gate array) and/or an ASIC (application-specific integrated circuit)). All or part of the system may be implemented using electronic hardware circuitry that include electronic devices such as, for example, at least one of a processor, a memory, a programmable logic device or a logic gate. 
     Elements of different embodiments described herein may be combined to form other embodiments not specifically set forth above. Other embodiments not specifically described herein are also within the scope of the following claims.