About This Guide
This document provides helpful reference information for the REST API requests that you can send to the FODIM API. This document is intended for the technical personnel who customize and deploy this optimized solution according to the requirements of the end customer.
Introduction to Framework for Open Distributed Manageability(FODIM)
Welcome to the FODIM API!
Managing a multitude of IT infrastructure devices of different make and type is something of a task, especially, when they exist across multiple locations. With the help of the FODIM API and a set of plugins(generic Redfish plugin and vendor-specific plugins such as HPE iLO, CFM), you can virtually bring all the devices(compute, storage, and networking) to be managed in one place.
The FODIM API is a programming interface enabling easy and secure management of wide range of southbound equipment distributed across multiple data centers.
The APIs exposed by the FODIM are organized around REST and are designed as per DMTF's Redfish® Scalable Platforms API(Redfish) specification 2019.3 DSP2046.
All request and response bodies, including errors, are in JSON format.
Key benefits of the FODIM API
Comprehensive lifecycle management of southbound infrastructure: the FODIM API maintains a central repository of southbound equipment and simplifies device discovery, configuration, monitoring, and administration of all devices.
Scalable: leveraging the resource aggregation capability of the FODIM API, you can manage a wide range of different southbound devices(from stand-alone to rack mount and bladed to large-scale environments).
Simplifies interaction of northbound clients with southbound systems: the FODIM API offers a protocol-independent eventing mechanism using which northbound clients get notified of alarms from southbound equipment.
FODIM logical architecture
The FODIM based on Redfish standards uses RESTful API to create an environment that is designed to be implemented on many different models of servers and other IT infrastructure devices for years to come. These devices may be quite different from one another. For this reason, the Redfish API does not specify the URIs to various resources.
Using the FODIM API
The FODIM API is available on version __ or later.
To access the RESTful APIs, you need an HTTPS-capable client, such as a web browser with a REST Client plugin extension, or a Desktop REST Client application (such as Postman), or cURL (a popular, free command line utility). You can also easily write simple REST clients for RESTful APIs using modern scripting languages.
Tip: It is good to use a tool, such as cURL or Postman initially to perform requests. Later, you will want to write your own scripting code to do this.
Note: The examples shown in this document use cURL to make HTTP requests.
Curl is a command line tool which helps you get or send information through URLs using supported protocols(HTTP
in the case of FODIM).
It is available at http://curl.haxx.se/ .
All the cURL examples use the following options(flags):
--insecure
bypasses validation of the HTTPS certificate. In actual usage, the FODIM RESTful API should be configured to use a user-supplied certificate and this option is not necessary.-i
returns HTTP response headers.
HTTP Request Methods, Responses, and Error Codes for FODIM REST API
Following are the Redfish defined HTTP methods that you can use to implement various actions:
| HTTP Request Methods | Description |
|---|---|
GET [Read Requests] |
Use this method to request a representation of a specified resource (single resource or collection). |
PATCH [Update] |
Use this method to apply partial modifications to a resource. |
POST [Create] [Actions] |
Use this method to create a new resource. Submit this request to the resource collection to which you want to add the new resource. You can also use this method to initiate operations on an object. |
DELETE [Delete] |
Use this method to delete a resource. |
The FODIM Redfish supports the following responses:
| Responses | Description |
|---|---|
| Metadata responses | Describes the resources and types exposed by the service to generic clients. |
| Resource responses | Response in JSON format for an individual resource. |
| Resource collection responses | Response in JSON format for a collection of a resources. |
| Error responses | In case of an HTTP error, a high level JSON response is provided with additional information |
HTTP status codes
Following are the HTTP Status codes with their descriptions:
| Status Code |
Description |
|---|---|
| 200 OK | Successful completion of the request with representation in the body |
| 201 Created | A new resource is successfully created with the Location header set to well-defined URI for the newly created resource. The response body includes the representation of the newly created resource. |
| 202 Accepted | The request has been accepted for processing but not processed. The Location header is set to URI of a task monitor that can be queried later for the status of the operation. |
| 204 No content | The request was a success but no content was returned in the body of the response. |
| 301 Moved Permanently | The requested resource resides in a different URI given by the Location headers. |
| 302 Found | The requested resource temporarily resides in a different URI. |
| 304 Not Modified | When the service has performed conditional GET request but the resource content has not changed. |
| 400 Bad Request | The request could not be performed due to missing or invalid information. An extended error message is returned in the response body. |
| 401 Unauthorized | Missing or invalid authentication credentials included with a request. |
| 403 Forbidden | The server recognizes the credentials to be not having the necessary authorization to perform the operation. |
| 404 Not Found | The request specified the URI of a non-existing resource. |
| 405 Method Not Allowed | When the HTTP verb specified in the request (GET, PATCH, DELETE, and so on) is not supported for a particular request URI. The response includes "Allow" header that lists the supported methods. |
| 406 Not Acceptable | When the resource fails to generate a response that matches the media types specified in the Accept header. |
| 409 Conflict | A creation or an update cannot be completed because it would conflict with the current state of the resources supported by the platform. |
| 410 Gone | When the requested resource is no longer available in the server and there is no forwarding address available as well. This condition is expected to be considered permanent. Clients with hyperlink editing capabilities SHOULD delete references to the Request-URI after user approval. If the server does not know, or has no facility to determine, whether or not the condition is permanent, the status code 404 (Not Found) SHOULD be used instead. This response is cacheable unless indicated otherwise. |
| 411 Length Required | When the content of the length is not specified using the Content-Length header. |
| 412 Precondition Failed | When pre-condition (OData-version) checks fail. |
| 415 Unsupported Media Type | When the Content-type specified for the body does not match. |
| 428 Precondition Required | When the request does not provide the pre-condition such as an If-Match |
| 431 Request Header Field Too Large | When the individual header or all the header fields in a request are too large, the server does not fulfils the request. |
| 500 Internal Server Error | When the server encounters and unexpected condition that prevents it from fulfilling the request. |
| 501 Not Implemented | When the server does not recognize or supports the method for any resource. |
| 503 Service Unavailable | When the server is currently unable to service the request due to temporary overloading or maintenance. |
| 507 Insufficient Storage | When the size of the response is too big for the server to build the response. |
Authenticating HTTP requests
Following authentication methods can be implemented to authenticate requests to the FODIM REST API:
HTTP BASIC authentication
You can implement HTTP BASIC authentication by providing valid FODIM user name and password in an HTTP
Authorization: Basic
header.
curl -i --insecure -X GET\
-H 'Accept:application/json' \
-H 'Authorization:Basic {username}:{password}' \
'https://{FODIM_IP_address}/redfish/v1/AggregationService'
Redfish session login authentication
You can implement Redfish Session Login Authentication by creating a Redfish login session through session management interface. To learn more about a session, see Creating and managing sessions section.
Every session that is created has an authentication token called
X-AUTH-TOKEN
associated with it.To authenticate subsequent requests, provide this token in the
X-AUTH-TOKEN
request header.
curl -i --insecure -X GET \
-H 'Accept:application/json' \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/redfish/v1/AggregationService'
NOTE:
When Basic Auth is used, a session is not created.
If you perform an HTTP operation(without providing authentication) on resources other than those mentioned below, you will receive an HTTP
401 unauthorized
error.Resource URI Description The Redfish service root GET
/redfish
The URI for the Redfish Service Root. It returns the Redfish services' version. The list of Redfish services GET
/redfish/v1
It returns a list of available services. The $metadata GET
/redfish/v1/$metadata
the Redfish Metadata Document. The OData Service Document GET
/redfish/v1/odata
the Redfish OData Service Document. The Sessions
resourcePOST
/redfish/v1/SessionService/Sessions
Creates a Redfish login session. An
X-AUTH-TOKEN
is valid and a session is open only for 30 minutes, unless the user continues to send requests to a Redfish service using this token.An idle session is automatically terminated after the timeout interval.
List of supported APIs
The FODIM Redfish supports the following APIs:
| URI | Operation Applicable |
|---|---|
| /redfish | GET |
| /redfish/v1 | GET |
| /redfish/v1/odata | GET |
| /redfish/v1/$metadata | GET |
| /redfish/v1/SessionService | GET |
| /redfish/v1/SessionService/Sessions | POST, GET |
| /redfish/v1/SessionService/Sessions/{session id} | GET, DELETE |
| /redfish/v1/AccountService | GET |
| /redfish/v1/AccountService/Accounts | POST, GET |
| /redfish/v1/AccountService/Accounts/{Account id} | GET, DELETE, PATCH |
| /redfish/v1/AccountService/PrivilegeRegistry | GET |
| /redfish/v1/AccountService/Roles | POST, GET |
| /redfish/v1/AccountService/Roles/{Roles id} | GET, DELETE, PATCH |
| /redfish/v1/AggregationService/Actions/AggregationService.Add | POST |
| /redfish/v1/AggregationService/Actions/AggregationService.Remove | POST |
| /redfish/v1/AggregationService/Actions/AggregationService.Reset | POST |
| /redfish/v1/AggregationService/Actions/AggregationService.SetDefaultBootOrder | POST |
| /redfish/v1/Systems | GET |
| /redfish/v1/Systems/{ComputerSystemId} | GET |
| /redfish/v1/Systems/{ComputerSystemId}/Memory | GET |
| /redfish/v1/Systems/{ComputerSystemId}/MemoryDomains | GET |
| /redfish/v1/Systems/{ComputerSystemId}/NetworkInterfaces | GET |
| /redfish/v1/Systems/{ComputerSystemId}/EthernetInterfaces | GET |
| /redfish/v1/Systems/{ComputerSystemId}/bios | GET |
| /redfish/v1/Systems/{ComputerSystemId}/SecureBoot | GET |
| /redfish/v1/Systems/{ComputerSystemId}/Storage | GET |
| /redfish/v1/Systems/{ComputerSystemId}/Processors | GET |
| /redfish/v1/Systems/{ComputerSystemId}/Memory/{MemoryId} | GET |
| /redfish/v1/Systems/{ComputerSystemId}/EthernetInterfaces/{Id} | GET |
| /redfish/v1/Systems/{ComputerSystemId}/Processors/{Id} | GET |
| /redfish/v1/Chassis | GET |
| /redfish/v1/Chassis/{ComputerSystemId} | GET |
| /redfish/v1/Chassis/{ComputerSystemId}/Thermal | GET |
| /redfish/v1/Chassis/{ComputerSystemId}/NetworkAdapters | GET |
| /redfish/v1/Chassis/{ComputerSystemId}/Power | GET |
| /redfish/v1/Systems?filter={searchKeys}%20{conditionKeys}%20{value} | GET |
| /redfish/v1/EventService/Subscriptions | POST |
| /redfish/v1/Fabrics | GET |
| /redfish/v1/Fabrics/{fabricID} | GET |
| /redfish/v1/Fabrics/{fabricID}/Switches | GET |
| /redfish/v1/Fabrics/{fabricID}/Switches/{switchID} | GET |
| /redfish/v1/Fabrics/{fabricID}/Switches/{switchID}/Ports |
GET |
| /redfish/v1/Fabrics/{fabricID} /Switches/{switchID}/Ports/{portid} |
GET |
| /redfish/v1/TaskService | GET |
| /redfish/v1/TaskService/Tasks | GET |
| /redfish/v1/TaskService/Tasks/{TaskID} | GET |
| /taskmon/{TaskID} | GET |
NOTE:
*ComputerSystemId
is FODIM specified unique id of the server. It is represented as {UUID}:{n}
in the FODIM API( Example : ba0a6871-7bc4-5f7a-903d-67f3c205b08c:1 )
Viewing the list of supported Redfish services
| Method | GET |
|---|---|
| URI | /redfish/v1 |
| Description | The URI for the Redfish Service Root. |
| Returns | All the available services in the Service Root. |
| Response Code | 200 on success |
curl -i GET \
'https://FODIM_IP\_address/redfish/v1'
Sample Response header
status:200
allow:GET
cache-control:no-cache
content-type:application/json; charset=UTF-8
etag:W/"12345"link: </redfish/v1/SchemaStore/en/ServiceRoot.json/>; rel=describedby
odata-version:4.0
x-frame-options:sameorigin
content-length:799 bytes
date:Wed,
13 Nov 2019 10:23:52 GMT+7m 16s
Sample Response body
{
"@odata.context":"/redfish/v1/$metadata#ServiceRoot.ServiceRoot",
"@odata.etag":"W/\"12345\"",
"@odata.id":"/redfish/v1/",
"@odata.type":"#ServiceRoot.v1_5_0.ServiceRoot",
"Id":"RootService",
"SessionService":{
"@odata.id":"/redfish/v1/SessionService"
},
"AccountService":{
"@odata.id":"/redfish/v1/AccountService"
},
"EventService":{
"@odata.id":"/redfish/v1/EventService"
},
"Tasks":{
"@odata.id":"/redfish/v1/TaskService"
},
"AggregationService":{
"@odata.id":"/redfish/v1/AggregationService"
},
"Systems":{
"@odata.id":"/redfish/v1/Systems"
},
"Chassis":{
"@odata.id":"/redfish/v1/Chassis"
},
"FabricService":{
"@odata.id":"/redfish/v1/Fabrics"
},
"Links":{
"Sessions":{
"@odata.id":"/redfish/v1/SessionService/Sessions"
}
},
"Name":"Root Service",
"Oem":{
},
"RedfishVersion":"1.7.0",
"UUID":"9b305353-b1e8-4680-bc1d-4b4a2e0de096"
}
Creating and managing sessions
A session represents a window of user's login with a Redfish service and contains details about the user and the user activity. You can run multiple sessions simultaneously on FODIM.
The FODIM offers Redfish SessionService interface for managing sessions and exposes APIs to achieve the following:
Creating a session
Listing active sessions
Deleting a session
Supported APIs
/redfish/v1/SessionService
/redfish/v1/SessionService/Sessions
/redfish/v1/SessionService/Sessions/{session id}
Creating a session
| Method | POST |
|---|---|
| URI | /redfish/v1/SessionService/Sessions |
| Description | This endpoint is used to create a session to implement authentication. Creating a session allows you to obtain an X-AUTH-TOKEN which is then used to authenticate other services. |
| Authentication | No authentication is required. |
| Returns | An X-AUTH-TOKEN header containing session authentication token.A Location header that contains a link to the newly created session instance.Message in the JSON response body saying that the session is created . |
| Response Code | 201 on success |
Note:
It is a good practice to make note of the session authentication token returned in the X-AUTH-TOKEN
header and session id returned in the Location
header. You will need the session authentication token to authenticate subsequent requests to the FODIM API and the session id to log out later.
curl --insecure -X POST \
-H "Content-Type:application/json" \
-d \
'{
"UserName": "{username},
"Password": "{password}"
}' \
'https://{FODIM_IP_address}/redfish/v1/SessionService/Sessions'
Request URI parameters
| Parameter | Type | Description |
|---|---|---|
| Username | string | User name for the user account for this session. |
| Password | string | Password for the user account for this session. |
Sample Request body
{
"Username": "abc",
"Password": "abc123"
}
Sample Response header
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
Etag: W/"02C2D1BB"
Link: </redfish/v1/SessionService/Sessions/1a547199-0dd3-42de-9b24-1b801d4a1e63/>; rel=self
Location: \{FODIM\_IP_address\}/redfish/v1/SessionService/Sessions/1a547199-0dd3-42de-9b24-1b801d4a1e63
Odata-Version: 4.0
**X-Auth-Token: 46987bb2-0df7-44c1-8668-44f2ec86dbe3**
X-Frame-Options: sameorigin
Date:
Thu, 22 Aug 2019 21:23:21 GMT+6m 30s
Transfer-Encoding: chunked
Sample Response body
"error":{
"code": "iLO.0.10.ExtendedInfo",
"message": "See @Message.ExtendedInfo for more information.",
"@Message.ExtendedInfo":[
{
"MessageId": "Base.1.0.Created"
}
]
}
}
Listing the active sessions
| Method | GET |
|---|---|
| URI | /redfish/v1/SessionService/Sessions |
| Description | This endpoint retrieves a list of active sessions. |
| Authentication | X-AUTH-TOKEN Authorization or Basic Authorization. |
| Returns | A list of active user sessions. |
| Response Code | 200 on success |
curl --insecure -X GET \
-H 'Accept:application/json' \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://FODIM_IP_address/redfish/v1/SessionService/Sessions'
Sample Response header
Cache-Control:
no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"16B6EF53"
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date:
Wed, 18 Sep 2019 06:02:58 GMT+6m 41s
Transfer-Encoding: chunked
** Sample Response body **
{
<EMAIL_ADDRESS>"/redfish/v1/$metadata#SessionCollection.SessionCollection",
<EMAIL_ADDRESS>"W/\\\"117102B2\\\"",
<EMAIL_ADDRESS>"/redfish/v1/SessionService/Sessions/",
<EMAIL_ADDRESS>"#SessionCollection.SessionCollection",
"Name": "Sessions",
"Description": "Bruce User Sessions",
<EMAIL_ADDRESS>3,
"Members":[
{
<EMAIL_ADDRESS>"/redfish/v1/SessionService/Sessions/13d28b5b-3ead-4ec4-85cc-a83791294589/"
},
{
<EMAIL_ADDRESS>"/redfish/v1/SessionService/Sessions/194afeda-46d2-442b-98dc-468dab6cc1df/"
},
{
<EMAIL_ADDRESS>"/redfish/v1/SessionService/Sessions/4b53dcf0-e650-4153-b73a-398ed1125f44/"
}
]
}
Viewing information about a single session
| Method | GET |
|---|---|
| URI | /redfish/v1/SessionService/Sessions/{session id} |
| Description | A specific user session. |
| Authentication | X-AUTH-TOKEN Authorization or Basic Authorization. |
| Returns | Details of this session. |
| Response Code | 200 on success |
curl --insecure -X GET \
-H 'Accept:application/json' \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://FODIM_IP_address/redfish/v1/SessionService/Sessions/{session id}'
NOTE:
Replace {session id}
with the Session Id returned in the Location
header from session creation.
Sample Response header
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"16B6EF53"
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date: Thu, 12 Sep 2019 19:27:48 GMT+6m 2s
Transfer-Encoding: chunked
Sample Response body
{
<EMAIL_ADDRESS>"/redfish/v1/$metadata#Session.Session",
<EMAIL_ADDRESS>"W/\"16B6EF53\"",
<EMAIL_ADDRESS>"/redfish/v1/SessionService/Sessions/1e0492f8-112d-4f9a-8102-a87bf5706d1f",
<EMAIL_ADDRESS>"#Session.v1_0_0.Session",
"ID": "1e0492f8-112d-4f9a-8102-a87bf5706d1f",
"Description": "Manager Bruce Session",
"Name": "Bruce Session",
"Oem":{},
"UserName": "abc"
}
Deleting a session
| Method | DELETE |
|---|---|
| URI | /redfish/v1/SessionService/Sessions/{sessions id} |
| Description | DELETE method on this endpoint is used to terminate a specific Redfish session when the user logs out. |
| Authentication | X-AUTH-TOKEN Authorization or Basic Authorization. |
| Response Code | 200 on success |
NOTE:
- A user with operator
privileges can delete a session using the Session ID and the X-AUTH-TOKEN that they created.
- A user with admin
privileges can delete any active session.
curl --insecure -X DELETE \
-H 'Accept:application/json' \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://FODIM_IP_address/redfish/v1/SessionService/Sessions/{session id}'
Sample response header
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"16B6EF53"
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date: Thu, 12 Sep 2019 19:40:08 GMT+6m 2s
Transfer-Encoding: chunked
Sample response body
none
Configuring roles and privileges for a user
The FODIM API supports role-based authorization of requests - the roles and privileges control which users have what access to resources.
Roles
A role represents a set of operations that a user is allowed to perform and is determined by a defined set of privileges. The privileges of a role are configurable - you can choose a privilege or a set of privileges to assign to a role at the time of role creation.
See Creating a role.
With FODIM, there are two kinds of defined roles:
Redfish pre-defined roles
Redfish pre-defined roles come with a pre-defined set of privileges. You can assign additional OEM privileges. Following are the Redfish pre-defined roles:
- Administrator
- Operator
- ReadOnly
OEM(Original Equipment Manufacturer) roles
OEM roles are the custom roles that you can create and assign to a user. Following are the available OEM roles:
- admin : The admin is an OEM pre-defined role that has all the privileges needed to manage all services. The admin can perform any actions such as adding and removing equipments, adding or removing users or privileges, and so on.
- client : The client is an OEM role that uses the northbound APIs to manage the southbound infrastructure.
- monitor : The Monitor is an OEM role that is used typically by northbound monitoring solutions, this user role performs actions such as setting up subscriptions to be notified on Alerts from southbound infrastructure.
NOTE:
Every user is assigned one role at the time of user account creation; ensure that an OEM role is created before assigning it to a user at the time of user account creation.
Privileges
A privilege is a permission to perform an operation or a set of operations within a defined management domain. There are Redfish specified set of privileges as well as OEM-defined privileges.
The following privileges can be assigned to any user in FODIM:
ConfigureComponents : Users with this privilege can configure components managed by the services in FODIM Redfish API.
ConfigureManager : Users with this privilege can configure manager resources.
ConfigureSelf : Users with this privilege can change the password for their account.
ConfigureUsers : Users with this privilege can configure users and their accounts. This privilege is assigned to an administrator.
Login : Users with this privilege can log into the service and read the resources.
NOTE:
The privileges set for a Redfish pre-defined role cannot be modified.
Mapping of privileges to roles in the FODIM API
| Roles | Assigned privileges |
|---|---|
| Administrator (Redfish pre-defined) | - Login - ConfigureManager - ConfigureUsers - ConfigureComponents - ConfigureSelf |
| Operator (Redfish pre-defined) | - Login - ConfigureComponents - ConfigureSelf |
| ReadOnly (Redfish pre-defined) | - Login - ConfigureSelf |
| admin (OEM) | |
| client (OEM) | |
| monitor (OEM) |
Creating a role
| Method | POST |
|---|---|
| URI | /redfish/v1/AccountService/Roles |
| Description | This operation creates a role that will be used by the AccountService to create a user account. |
| Response Code | 201 Created on success |
NOTE:
Only a user with ConfigureUsers
privilege can perform this operation.
curl --insecure -X POST \
-H "X-Auth-Token:{X-Auth-Token}" \
-H "Content-Type:application/json" \
-d \
'{
"id": "{SomeRole}",
"AssignedPrivileges": [{Set_of_Redfish_privileges}],
"OemPrivileges": [{Set_of_OEM_privileges}]
}' \
'https://{FODIM_IP_address}/redfish/v1/AccountService/Roles'
Sample Request body
{
"id": "ADMIN",
"AssignedPrivileges": ["Login","ConfigureManager","ConfigureUsers","ConfigureSelf","ConfigureComponents"],
"OemPrivileges": []
}
Request URI parameters
| Parameter | Type | Description |
|---|---|---|
| id | string | User name for the user account. |
| AssignedPrivileges | array (string (enum)) | The redfish privileges that this role includes. See FODIM Redfish API User roles and Privileges |
| OemPrivileges | array (string) | The OEM privileges that this role includes. See FODIM Redfish API User roles and Privileges |
Sample Response header
Allow: "GET", "DELTE", "PATCH", "HEAD"
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"12345"
Link: /v1/SchemaStore/en/ManagerAccount.json/>; rel=describedby
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date: Fri, 13 Sep 2019 09:22:57 GMT+6m 38s
Transfer-Encoding: chunked
Sample Response body
{
<EMAIL_ADDRESS>"/redfish/v1/$metadata#ManagerAccount.ManagerAccount",
<EMAIL_ADDRESS>"W/\"12345\"",
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Accounts/admin/",
<EMAIL_ADDRESS>"#ManagerAccount.v1_1_3.ManagerAccount",
"UserName": "admin",
"RoleID": "ADMIN",
"Password": null,
"ID": "admin",
"Name": "User Account",
"Description": "Bruce user account",
"Links":{
"Role":{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/ADMIN/"
}
},
"Oem":{}
}
Listing roles
| Method | GET |
|---|---|
| URI | /redfish/v1/AccountService/Roles |
| Description | GET on this endpoint retrieves a list of user roles. |
| Returns | Links to user role resources. |
| Response Code | 200 OK on success |
NOTE:
Only a user with ConfigureUsers
privileges can perform this operation.
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/redfish/v1/AccountService/Roles'
Sample Response header
Allow: "GET"
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"12345"
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date: Thu, 22 Aug 2019 23:25:18 GMT+6m 30s
Transfer-Encoding: chunked
Sample Response body
{
<EMAIL_ADDRESS>"#RoleCollection.RoleCollection",
"Name": "Roles Collection",
<EMAIL_ADDRESS>10,
"Members":[
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/Administrator"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/ADMIN"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/monitor3"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/ADMIN"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/ADMIN"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/ReadOnly"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/ADMIN"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/Operator"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/RoleM"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/ADMIN"
}
],
<EMAIL_ADDRESS>"/redfish/v1/$metadata#RoleCollection.RoleCollection",
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles"
}
Getting information about a role
| Method | GET |
|---|---|
| URI | /redfish/v1/AccountService/Roles/{Role Id} |
| Description | A specific user role. |
| Returns | Details of this role like Id, name, assigned privileges, and more. |
| Response Code | 200 OK on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/redfish/v1/AccountService/Roles/{Role Id}'
NOTE:
Replace {Role Id}
with the user role Id created from role creation.
Sample Response header
Allow: "GET"
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"12345"
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date: Thu, 22 Aug 2019 23:25:18 GMT+6m 30s
Transfer-Encoding: chunked
Sample Response body
{
<EMAIL_ADDRESS>"#Role.v1_2_3.Role",
"Id": "monitor3",
"Name": "User Role",
"Description": "monitor3 User Role",
"IsPredefined": false,
"AssignedPrivileges":[
"Login",
"ConfigureUsers"
],
"OemPrivileges": null,
<EMAIL_ADDRESS>"/redfish/v1/$metadata#Role.Role",
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/monitor3"
}
Updating a role
| Method | PATCH |
|---|---|
| URI | /redfish/v1/AccountService/Roles/{Role Id} |
| Description | PATCH method on this endpoint updates privileges of a specific user role. |
| Returns | Details of this role with updated privileges. |
| Response Code | 200 OK on success |
curl --insecure -X PATCH \
-H "X-Auth-Token:{X-Auth-Token}" \
-H "Content-Type:application/json" \
-d \
'{
"AssignedPrivileges": [{Set_Of_Privileges_to_update}],
"OemPrivileges": []
}' \
'https://{FODIM_IP_address}/redfish/v1/AccountService/Roles/{Role Id}'
Sample Response header
status:200
allow:"GET"cache-control:no-cache
content-type:application/json; charset=utf-8
etag:W/"12345"odata-version:4.0
x-frame-options:sameorigin
content-length:328 bytes
date:Tue,
12 Nov 2019 11:12:41 GMT+1m 50s
Sample Response body
{
"@odata.type":"#Role.v1_2_3.Role",
"Id":"role2",
"Name":"User Role",
"Description":"role2 User Role",
"IsPredefined":false,
"AssignedPrivileges":[
"Login",
"ConfigureManager",
"ConfigureUsers",
"ConfigureSelf"
],
"OemPrivileges":null,
"@odata.context":"/redfish/v1/$metadata#Role.Role",
"@odata.id":"/redfish/v1/AccountService/Roles/role2"
}
Deleting a role
| Method | DELETE |
|---|---|
| URI | /redfish/v1/AccountService/Roles/{Role Id} |
| Description | DELETE method on this endpoint deletes a specific user role. |
| Response Code | 200 OK on success |
curl --insecure -X DELETE \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/redfish/v1/AccountService/Roles/{Role Id}'
Sample Response header
Cache-Control:
no-cache
Connection: keep-alive
Etag: W/"12345"
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date: Wed, 18 Sep 2019 12:12:27 GMT+6m 41s
Transfer-Encoding: chunked
Sample Response body
none
Creating and managing user accounts
The FODIM API allows users to have accounts to configure their actions and restrictions.
A user other than admin
needs to create an account by defining a user name, a password, and a role. The username and the password are used to establish a login session with the Redfish services later.
It exposes Redfish AccountsService APIs to manage user accounts. Use these endpoints to perform the following operations:
Creating, modifying, and deleting account details.
Fetching account details.
Supported APIs:
/redfish/v1/AccountService
/redfish/v1/AccountService/Accounts
/redfish/v1/AccountService/Accounts/{Account Id}
/redfish/v1/AccountService/Roles
/redfish/v1/AccountService/Roles/{Role id}
Creating an account
| Method | POST |
|---|---|
| URI | /redfish/v1/AccountService/Accounts |
| Description | POST method on this endpoint creates a user account. |
| Returns | A Location header that contains a link to the newly created account.The JSON response body containing the properties of the created account. |
| Response Code | 201 Created on success |
curl --insecure -X POST \
-H "X-Auth-Token:{X-Auth-Token}" \
-d \
'{"Username":"{username}","Password":"{password}","RoleId":"{roleId}"}
' \
'https://{FODIM_IP_address}/redfish/v1/AccountService/Accounts'
Request URI parameters
| Parameter | Type | Description |
|---|---|---|
| Username | string | User name for the user account. |
| Password | string | Password for the user account. See "Password Requirements" section below. |
| RoleId | string | The Role for this account. See FODIM Redfish API User roles and Privileges |
Password Requirements
Your password must not be same as your username.
Your password must be at least 12 characters long and at most 16 characters long. However, this length restriction is configurable.
Your password must contain at least one uppercase letter, one lowercase letter, one digit (0-9), and one special character.
Sample Request body
{
"Username": "test5",
"Password": "test123",
"RoleId": "MONITOR"
}
Sample Response header
Cache-Control:
no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"12345"
Link: /v1/AccountService/Accounts/test5/>; rel=describedby
**Location: /redfish/v1/AccountService/Accounts/test5/**
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date:
Tue, 17 Sep 2019 10:52:41 GMT+6m 41s
Transfer-Encoding: chunked
Sample Response body
{
<EMAIL_ADDRESS>"/redfish/v1/$metadata#ManagerAccount.ManagerAccount",
<EMAIL_ADDRESS>"W/\"12345\"",
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Accounts/test5/",
<EMAIL_ADDRESS>"#ManagerAccount.v1_1_3.ManagerAccount",
"UserName": "test",
"RoleID": "MONITOR",
"Password": null,
"ID": "test",
"Name": "User Account",
"Description": "Bruce user account",
"Links":{
"Role":{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/MONITOR/"
}
},
"Oem":{}
}
Listing user accounts
| Method | GET |
|---|---|
| URI | /redfish/v1/AccountService/Accounts |
| Description | This endpoint retrieves a list of user accounts. |
| Returns | Links to user account resources. |
| Response Code | 200 OK on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/v1/AccountService/Accounts'
Sample Response header
Allow: "GET", "POST", "HEAD"
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"12345"
Link: /v1/SchemaStore/en/ManagerAccountCollection.json/>; rel=describedby
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date: Fri, 13 Sep 2019 08:28:47 GMT-43m 57s
Transfer-Encoding: chunked
Sample Response body
{
<EMAIL_ADDRESS>"/redfish/v1/$metadata#ManagerAccountCollection.ManagerAccountCollection",
<EMAIL_ADDRESS>"W/\"12345\"",
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Accounts/",
<EMAIL_ADDRESS>"#ManagerAccountCollection.ManagerAccountCollection",
"Name": "Accounts ",
"Description": "Bruce User Accounts",
<EMAIL_ADDRESS>2,
"Members":[
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Accounts/monitor1/"
},
{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Accounts/admin/"
}
]
}
Getting single account information
| Method | GET |
|---|---|
| URI | /redfish/v1/AccountService/Accounts/{accountId} |
| Description | A specific user account. |
| Returns | Details of this user account. |
| Response Code | 200 OK on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/v1/AccountService/Accounts/{accountId}'
NOTE:
Replace {accountId}
with the username for the account whose details you want to fetch.
** Sample Response header**
Allow: "GET", "DELTE", "PATCH", "HEAD"
Cache-Control: no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"12345"
Link: /v1/SchemaStore/en/ManagerAccount.json/>; rel=describedby
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date: Fri, 13 Sep 2019 09:22:57 GMT+6m 38s
Transfer-Encoding: chunked
Sample Response body
{
<EMAIL_ADDRESS>"/redfish/v1/$metadata#ManagerAccount.ManagerAccount",
<EMAIL_ADDRESS>"W/\"12345\"",
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Accounts/admin/",
<EMAIL_ADDRESS>"#ManagerAccount.v1_1_3.ManagerAccount",
"UserName": "admin",
"RoleID": "ADMIN",
"Password": null,
"ID": "admin",
"Name": "User Account",
"Description": "Bruce user account",
"Links":{
"Role":{
<EMAIL_ADDRESS>"/redfish/v1/AccountService/Roles/ADMIN/"
}
},
"Oem":{}
}
Updating an account
| Method | PATCH |
|---|---|
| URI | /redfish/v1/AccountService/Accounts/{accountId} |
| Description | PATCH method on this endpoint updates user account details such as username, password, and RoleId. |
| Returns | Message in the JSON response body saying that the account is modified. |
| Response Code | 200 OK on success |
curl --insecure -X PATCH \
-H "X-Auth-Token:{X-Auth-Token}" \
-H "Content-Type:application/json" \
-d \
'{
"Password": "{new_password}"
}
' \
'https://{FODIM_IP_address}/redfish/v1/AccountService/Accounts/{accountId}'
NOTE:
Replace
{accountId}
with the username for the account whose details you want to update.Add the account details (username, password, and RoleId) to be modified in the request payload.
Sample Request body
{
"Password": "test12",
"RoleId": "MONITOR"
}
Sample Response header
Cache-Control:
no-cache
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Etag: W/"12345"
Link: /v1/AccountService/Accounts/test6/>; rel=describedby
Location: /redfish/v1/AccountService/Accounts/test6/
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date:
Wed, 18 Sep 2019 08:42:05 GMT+6m 41s
Transfer-Encoding: chunked
Sample Response body
BODY
pretty
{
"error":{
"code": "iLO.0.10.ExtendedInfo",
"message": "See @Message.ExtendedInfo for more information.",
"@Message.ExtendedInfo":[
{
"MessageId": "Base.1.0.AccountModified"
}
]
}
Deleting an account
| Method | DELETE |
|---|---|
| URI | /redfish/v1/AccountService/Accounts/{accountId} |
| Description | DELETE method on this endpoint deletes a user account. |
| Response Code | 200 OK on success |
curl --insecure -X DELETE \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/redfish/v1/AccountService/Accounts/{accountId}'
NOTE:
Replace {accountId}
with the username for the account which you want to delete.
Sample Response header
Cache-Control:
no-cache
Connection: keep-alive
Etag: W/"12345"
Odata-Version: 4.0
X-Frame-Options: sameorigin
Date:
Wed, 18 Sep 2019 08:52:30 GMT+6m 41s
Transfer-Encoding: chunked
Sample Response body
none
Aggregating and managing southbound infrastructure
One of the state-of-the-art features of the FODIM API is that it allows users to add and group southbound infrastructure(servers, storage devices, or fabrics) into one aggregate for easy manageability. It offers Redfish AggregationService as an interface and exposes endpoints to achieve the following:
Adding a resource to manage and constructing its detailed inventory.
Resetting one or more resources.
Changing the boot path of one or more resources to default settings.
Removing a resource and its inventory.
Using these endpoints, you can add or remove only one resource at a time. You can group the resources into one collection and perform actions such as reset and setdefaultbootorder in combination on that group.
All aggragation actions are performed as tasks in the FODIM API. The actions performed on a group of resources(resetting or changing the boot order to default settings) are carried out as a set of sub-tasks.
The next section contains the use case for server aggregation.
Prerequisites
- To access Redfish AggregationService endpoints, ensure that the user has
ConfigureComponents
privilege.
Supported Endpoints
/redfish/v1/AggregatorService/Actions/AggregationService.Add
/redfish/v1/AggregatorService/Actions/AggregationService.Remove
/redfish/v1/AggregationService/Actions/AggregationService.Reset
/redfish/v1/AggregationService/Actions/AggregationService.SetDefaultBootOrder
The aggregation service root
| Method | GET |
|---|---|
| URI | redfish/v1/AggregationService |
| Description | The URI for the Aggregation service root. |
| Returns | Properties for the service and a list of actions you can perform using this service. |
| Response Code | 200 on success |
curl -i --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/redfish/v1/AggregationService'
Sample response header
allow: GET
cache-control: no-cache
content-length: 1 kilobytes
content-type: application/json; charset=utf-8
date: Mon, 18 Nov 2019 14:52:21 GMT+5h 37m
etag: W/"12345"
link: /v1/SchemaStore/en/AggregationService.json>; rel=describedby
odata-version: 4.0
status: 200
x-frame-options: sameorigin
Sample response body
{
"@odata.context":"/redfish/v1/$metadata#AggregationService.AggregationService",
"@odata.etag":"W/\"979B45E7\"",
"Id":"AggregationService",
"@odata.id":"/redfish/v1/AggregationService",
"@odata.type":"#AggregationService.v1_0_0.AggregationService",
"Name":"AggregationService",
"Description":"AggregationService",
"Actions":{
"#AggregationService.Add":{
"target":"/redfish/v1/AggregationService/Actions/AggregationService.Add/",
"@Redfish.ActionInfo":"/redfish/v1/AggregationService/AddActionInfo"
},
"#AggregationService.Remove":{
"target":"/redfish/v1/AggregationService/Actions/AggregationService.Remove/",
"@Redfish.ActionInfo":"/redfish/v1/AggregationService/RemoveActionInfo"
},
"#AggregationService.Reset":{
"target":"/redfish/v1/AggregationService/Actions/AggregationService.Reset/",
"@Redfish.ActionInfo":"/redfish/v1/AggregationService/ResetActionInfo"
},
"#AggregationService.SetDefaultBootOrder":{
"target":"/redfish/v1/AggregationService/Actions/AggregationService.SetDefaultBootOrder/",
"@Redfish.ActionInfo":"/redfish/v1/AggregationService/SetDefaultBootOrderActionInfo"
}
},
"ServiceEnabled":true,
"Status":{
"Health":"OK",
"HealthRollup":"OK",
"State":"Enabled"
}
}
Use case for server aggregation
Adding a server
| Method | POST |
|---|---|
| URI | /redfish/v1/AggregatorService/Actions/AggregationService.Add |
| Returns | Location URI of the task monitor associated with this operation in the response header. |
| Response Code | 202 on success |
Description
This action adds a single server and performs a detailed inventory of it.
On success, ORCA specified Computer System Id
is assigned to the added server.
NOTE:
Make note of the Computer System Id
. You will need this to perform subsequent actions such as delete, reset, and setdefaultbootorder on this server.
curl -i --insecure -X POST \
-H "X-Auth-Token:{X-Auth-Token}" \
-H "Content-Type:application/json" \
-d \
'{"ManagerAddress":"{Server_IP_Address}","UserName":"{Account_UserName}","Password":"{Account_Password}","Oem":{"PluginID":"{Redfish_PluginId}"}}' \
'https://{FODIM_IP_address}/redfish/v1/AggregationService/Actions/AggregationService.Add'
Sample request body
{
"ManagerAddress": "<IP_ADDRESS>",
"Username": "username",
"Password": "password",
"Oem": {
"PluginID": "GRF"
}
}
Request Parameters
| Parameter | Type | Description |
|---|---|---|
| ManagerAddress | A valid IP address or hostname of a baseboard management controller (BMC) | |
| Username | string | The username for this user account |
| Password | string | The password for this user account |
| PluginID | string | The plugin id Example : GRF (Generic Redfish Plugin) |
Sample response header
content-length:0 byte
content-type:application/json; charset=utf-8
date:Thu,
07 Nov 2019 09:29:36 GMT+7m 8s
**location:/taskmon/taskb297ff4e-0d2d-485c-8217-63d888cba7d2**
odata-version:4.0
status:202
x-frame-options:sameorigin
Sample response body
None
Knowing the addition status
To know the status of the progress of this action, perform GET
on the URI of the task monitor returned in the Location
header.
If the task is still running, you will receive the following information in the JSON response indicating that the task is yet to complete:
- Task state as "Running"
- percentage of completion
If the task is complete(server is successfully added in the inventory), you will receive a link to the added server in the
Location
header and in the response body as well.
Sample header: when the task status is running
status:202
allow:"GET"cache-control:no-cache
content-type:application/json; charset=utf-8
date:Wed,04 Dec 2019 12:30:59 GMT+5h 37m
etag:W/"12345"
location:/taskmon/taskac4d5b78-9ba8-46b4-b69b-0f3580aec2c2
odata-version:4.0
x-frame-options:sameorigin
content-length:691 bytes
Sample response body: when the task is running
{
"@odata.type":"#Task.v1_3_0.Task",
"Id":"taskac4d5b78-9ba8-46b4-b69b-0f3580aec2c2",
"Name":"Task taskac4d5b78-9ba8-46b4-b69b-0f3580aec2c2",
"Description":"",
"TaskState":"Running",
"StartTime":"2019-12-04 12:30:52.222338243 +0530 IST",
"EndTime":"0001-01-01 00:00:00 +0000 UTC",
"TaskStatus":"OK",
"SubTasks":"/redfish/v1/Tasks/taskac4d5b78-9ba8-46b4-b69b-0f3580aec2c2/SubTasks",
"TaskMonitor":"/taskmon/taskac4d5b78-9ba8-46b4-b69b-0f3580aec2c2",
"PercentComplete":4,
"Payload":{
"HttpHeaders":null,
"HttpOperation":"",
"JsonBody":null,
"TargetUri":""
},
"Messages":null,
"@odata.context":"/redfish/v1/$metadata#Task.Task",
"@odata.id":"/redfish/v1/TaskService/Tasks/taskac4d5b78-9ba8-46b4-b69b-0f3580aec2c2"
}
Sample header: when the task is complete
content-length:74 bytes
content-type:application/json; charset=utf-8
date:Wed,
04 Dec 2019 06:48:14 GMT+7m 42s
location:/redfish/v1/Systems/bffb4a1b-0d19-4531-ba44-0ac83c77579d:1
odata-version:4.0
status:201
x-frame-options:sameorigin
Sample response body: when the task status is complete
{
"@odata.id":"/redfish/v1/Systems/bffb4a1b-0d19-4531-ba44-0ac83c77579d:1"
}
Resetting one or more servers
| Method | POST |
|---|---|
| URI | /redfish/v1/AggregatorService/Actions/AggregationService.Reset |
| Returns | Location URI of the task monitor associated with this operation in the response header. |
| Response Code | 202 on success |
Description
This action shuts down, powers up, and restarts one or more servers.
You can perform reset on a group of servers by specifying multiple target URIs in the request.
curl -i --insecure -X POST \
-H "X-Auth-Token:{X-Auth-Token}" \
-H "Content-Type:application/json" \
-d \
'{
<EMAIL_ADDRESS>"Copyright 2018-2019 DMTF. All rights reserved.",
<EMAIL_ADDRESS>"/redfish/v1/$metadata#ActionInfo.ActionInfo",
<EMAIL_ADDRESS>"/redfish/v1/AggregationService/ResetActionInfo",
<EMAIL_ADDRESS>"#ActionInfo.v1_0_3.ActionInfo",
"Id": "AddActionInfo",
"Name": "Reset Action Info",
"Oem": {
},
"parameters": {
"ResetCollection": {
"description": "Collection of ResetTargets",
"ResetTarget": [{
"ResetType": "ForceRestart",
"TargetUri": "/redfish/v1/Systems/{ComputerSystemId}"
},
{
"ResetType": "ForceOff",
"TargetUri": "/redfish/v1/Systems/{ComputerSystemId}"
}
]
}
}
}' \
'https://{FODIM_IP_address}/redfish/v1/AggregationService/Actions/AggregationService.Reset'
Sample request body
{
"@Redfish.Copyright":"Copyright 2018-2019 DMTF. All rights reserved.",
"@odata.context":"/redfish/v1/$metadata#ActionInfo.ActionInfo",
"@odata.id":"/redfish/v1/AggregationService/ResetActionInfo",
"@odata.type":"#ActionInfo.v1_0_3.ActionInfo",
"Id":"AddActionInfo",
"Name":"Reset Action Info",
"Oem":{
},
"parameters":{
"ResetCollection":{
"description":"Collection of ResetTargets",
"ResetTarget":[
{
"ResetType":"ForceRestart",
"TargetUri":"/redfish/v1/Systems/f0c61692-a8dc-46ce-b85c-bf4753c3abdf:1"
},
{
"ResetType":"ForceOff",
"TargetUri":"/redfish/v1/Systems/24b243cf-f1e3-5318-92d9-2d6737d6b0b9:1"
}
]
}
}
}
Request Parameters
| Parameter | Type | Description |
|---|---|---|
| @odata.context | string | Refer to Common Redfish Schema parameters section. |
| @odata.id | string | Refer to Common Redfish Schema parameters section. |
| @odata.type | string | Refer to Common Redfish Schema parameters section. |
| Id | string | Refer to Common Redfish Schema parameters section. |
| Name | string | Refer to Common Redfish Schema parameters section. |
| Oem | object | Refer to Common Redfish Schema parameters section. |
| parameters[ { | array | The parameters associated with the Reset Action. |
| ResetType | string | The type of reset to be performed. See "Reset Type" section below, for the possible values of this property. |
| TargetUri } ] | string | The URI of the target for Reset - "/redfish/v1/Systems/<ComputerSystemId>" |
Reset Type
| string | Description |
|---|---|
| ForceOff | Turn the unit off immediately (non-graceful shutdown). |
| ForceOn | Turn the unit on immediately. |
| ForceRestart | Perform an immediate (non-graceful) shutdown, followed by a restart. |
| GracefulRestart | Perform a graceful shutdown followed by a restart of the system. |
| GracefulShutdown | Perform a graceful shutdown. Graceful shutdown involves shutdown of the operating system followed by the power off of the physical server. |
| Nmi | Generate a Diagnostic Interrupt (usually an NMI on x86 systems) to cease normal operations, perform diagnostic actions and typically halt the system. |
| On | Turn the unit on. |
| PowerCycle | Perform a power cycle of the unit. |
| PushPowerButton | Simulate the pressing of the physical power button on this unit. |
Sample Response header
content-length: 0 byte
content-type: application/json; charset=utf-8
date: Fri, 08 Nov 2019 07:49:42 GMT+7m 9s
location: /taskmon/taska9702e20-884c-41e2-bd9c-d779a4dd2e6e
odata-version: 4.0
status: 202
x-frame-options: sameorigin
Sample response body
None
Knowing the reset status
Resetting a group of servers is carried out as a set of sub-tasks: each sub-task resets a single server in the group.
Perform GET
on the URI of the task monitor returned in the Location
header.
If the task is yet to complete, you will receive the following information in the response body:
- An HTTP
202 Accepted
response. - Link to the list of sub-tasks associated with this group of servers. Perform
GET
on an individualsub-task
link to know the status of the reset action on the respective server. - Task status as "running".
- An HTTP
In case of errors, you will receive the following information:
- HTTP error code
- Error Message having a link to the main reset task in the response body.
Copy this link and perform
GET
to view the list of sub-tasks. To know which sub-tasks have failed, performGET
on the links individually.
If all the servers are successfully reset, you will receive an HTTP
200 OK
response and a success message in the response body.
Sample response header: when the task is complete
cache-control: no-cache
content-length: 469 bytes
content-type: application/json; charset=utf-8
date: Mon, 18 Nov 2019 09:42:45 GMT+7m 22s
etag: W/"12345"
odata-version: 4.0
status: 200
x-frame-options: sameorigin
Sample response body: when the task is complete
{
"error":{
"code":"Base.1.0.Success",
"message":"An error has occurred. See ExtendedInfo for more information.",
"@Message.ExtendedInfo":[
{
"@odata.type":"#Message.v1_0_6.Message",
"MessageId":"Base.1.0.Success",
"Message":"default error message all reset actions are successfully completed. for more information please check SubTasks in URI: /redfish/v1/TaskService/Tasks/task87f5825f-db3b-40f7-af07-d8d5781245cd",
…
}
]
}
}
**Sample response body in case of a failure
{
"error":{
"code":"Base.1.0.Success",
"message":"An error has occurred. See ExtendedInfo for more information.",
"@Message.ExtendedInfo":[
{
"@odata.type":"#Message.v1_0_6.Message",
"MessageId":"Base.1.0.Success",
"Message":"default error message one or more of the reset actions failed. for more information please check SubTasks in URI: /redfish/v1/TaskService/Tasks/taskb8ab3688-1d1f-4143-abcc-fe05b0fbac79",
…
}
]
}
}
Changing the boot order of a set of servers to default settings
| Method | POST |
|---|---|
| URI | /redfish/v1/AggregatorService/Actions/AggregationService.SetDefaultBootOrder |
| Returns | Location URI of the Task Monitor associated with this operation in the response header. |
| Response Code | 202 Accepted on success |
Description
This action changes the boot order of one or more servers to default settings.
You can perform setDefaultBootOrder on a group of servers by specifying multiple server URIs in the request.
curl -i --insecure -X POST \
-H "X-Auth-Token:{X-Auth-Token}" \
-H "Content-Type:application/json" \
-d \
'{
<EMAIL_ADDRESS>"Copyright 2018-2019 DMTF. All rights reserved.",
<EMAIL_ADDRESS>"/redfish/v1/$metadata#ActionInfo.ActionInfo",
<EMAIL_ADDRESS>"/redfish/v1/AggregationService/SetDefaultBootOrderActionInfo",
<EMAIL_ADDRESS>"#ActionInfo.v1_0_3.ActionInfo",
"Id": "AddActionInfo",
"Name": "SetDefaultBootOrder Action Info",
"parameters": {
"ServerCollection": [
"/redfish/v1/Systems/{ComputerSystemId}",
"/redfish/v1/Systems/{ComputerSystemId}"
]
}
}' \
'https://{FODIM_IP_address}/redfish/v1/AggregationService/Actions/AggregationService.SetDefaultBootOrder'
Sample request body
{
"@Redfish.Copyright":"Copyright 2018-2019 DMTF. All rights reserved.",
"@odata.context":"/redfish/v1/$metadata#ActionInfo.ActionInfo",
"@odata.id":"/redfish/v1/AggregationService/SetDefaultBootOrderActionInfo",
"@odata.type":"#ActionInfo.v1_0_3.ActionInfo",
"Id":"AddActionInfo",
"Name":"SetDefaultBootOrder Action Info",
"parameters":{
"ServerCollection":[
"/redfish/v1/Systems/97d08f36-17f5-5918-8082-f5156618f58d:1",
"/redfish/v1/Systems/76632110-1c75-5a86-9cc2-471325983653:1"
]
}
}
Request Parameters
| Parameter | Type | Description |
|---|---|---|
| @odata.context | string | Refer to Common Redfish Schema parameters. |
| @odata.id | string | Refer to Common Redfish Schema parameters. |
| @odata.type | string | Refer to Common Redfish Schema parameters. |
| Id | string | Refer to Common Redfish Schema parameters. |
| Name | string | Refer to Common Redfish Schema parameters. |
| parameters[ { | array | The parameters associated with the SetDefaultBootOrder Action. |
| ServerCollection } ] |
Target servers for setDefaultBootOrder |
Sample response header
status: 202
content-type: application/json; charset=utf-8
**location: /taskmon/task7c1b4b6c-8e46-4fb6-a66a-6f629c10d827**
odata-version: 4.0
x-frame-options: sameorigin
content-length: 0 byte
date:
Fri, 08 Nov 2019 08:13:40 GMT+7m 10s
Sample response body
None
Knowing the change status
Changing the boot order to default settings on a group of servers is carried out as a set of sub-tasks: each sub-task resets a single server in the group.
Perform GET
on the URI of the task monitor returned in the Location
header.
If the task is yet to complete, you will receive the following information in the response body:
- An HTTP
202 Accepted
response. - Link to the list of sub-tasks associated with this group of servers. Perform
GET
on an individualsub-task
link to know the status of the reset action on the respective server. - Task status as "running".
- An HTTP
In case of errors, you will receive the following information:
- An HTTP error code.
- An error message having a link to the main reset task in the response body.
Copy this link and perform
GET
to view the list of sub-tasks. To know which sub-tasks have failed, performGET
on the links individually.
If the action is successful, you will receive an HTTP
200 OK
response and a success message in the response body.
**Sample response body in case of a failure
{
"error":{
"code":"Base.1.0.Success",
"message":"An error has occurred. See ExtendedInfo for more information.",
"@Message.ExtendedInfo":[
{
"@odata.type":"#Message.v1_0_6.Message",
"MessageId":"Base.1.0.Success",
"Message":"default error message one or more of the SetDefaultBootOrder requests failed. for more information please check SubTasks in URI: /redfish/v1/TaskService/Tasks/task7fd888a8-26f3-489f-98b6-2287aae1c76f",
…
}
]
}
}
Deleting a server
| Method | POST |
|---|---|
| URI | /redfish/v1/AggregatorService/Actions/AggregationService.Remove |
| Returns | Location URI of the Task Monitor associated with this operation in the response header. |
| Response Code | 202 Accepted on success |
Description
This action removes a specific server and deletes its inventory.
To know the status of the progress of this operation, perform GET
on the URI of the task monitor returned in the Location
header. If the server is successfully removed from the inventory, you will receive an HTTP 200 OK
response.
curl -i --insecure -X POST \
-H "X-Auth-Token:{X-Auth-Token}" \
-H "Content-Type:application/json" \
-d \
'{
<EMAIL_ADDRESS>"Copyright 2018-2019 DMTF. All rights reserved.",
<EMAIL_ADDRESS>"/redfish/v1/$metadata#ActionInfo.ActionInfo",
<EMAIL_ADDRESS>"/redfish/v1/AggregationService/RemoveActionInfo",
<EMAIL_ADDRESS>"#ActionInfo.v1_0_3.ActionInfo",
"Id": "RemoveActionInfo",
"Name": "Remove Action Info",
"Oem": "",
"parameters": [
{
"Name": "/redfish/v1/Systems/{ComputerSystemId}"
}
]
}' \
'https://{FODIM_IP_address}/redfish/v1/AggregationService/Actions/AggregationService.Remove/'
Sample request body
{
<EMAIL_ADDRESS>"Copyright 2018-2019 DMTF. All rights reserved.",
<EMAIL_ADDRESS>"/redfish/v1/$metadata#ActionInfo.ActionInfo",
<EMAIL_ADDRESS>"/redfish/v1/AggregationService/RemoveActionInfo",
<EMAIL_ADDRESS>"#ActionInfo.v1_0_3.ActionInfo",
"Id": "AddActionInfo",
"Name": "Remove Action Info",
"Oem": "",
"parameters": [
{
"Name": "/redfish/v1/Systems/97d08f36-17f5-5918-8082-f5156618f58d:1"
}
]
}
Request Parameters
| Parameter | Type | Description |
|---|---|---|
| @odata.context | string | Refer to Common Redfish Schema parameters. |
| @odata.id | string | Refer to Common Redfish Schema parameters. |
| @odata.type | string | Refer to Common Redfish Schema parameters. |
| Id | string | Refer to Common Redfish Schema parameters. |
| Name | string | Refer to Common Redfish Schema parameters. |
| Oem | object | Refer to Common Redfish Schema parameters. |
| parameters[ { | array | The parameters associated with the Delete Action. |
| Name } ] |
string | The URI of the target to be removed - "/redfish/v1/Systems/{ComputerSystemId}" |
Sample response header
content-length: 0 byte
content-type: application/json; charset=utf-8
date: Fri, 08 Nov 2019 05:49:05 GMT+7m 10s
**location: /taskmon/taskd5bba4ec-35a3-43cc-a058-9634c488a488**
odata-version: 4.0
status: 202
x-frame-options: sameorigin
Sample response body
None
Viewing the resource inventory
The FODIM API allows you to view the inventory of managed southbound equipment through Redfish SystemService endpoints. It also offers the capability to search the inventory based on one or more resource configuration parameters.
Perform GET
on these endpoints to discover crucial configuration information about a resource(such as CPU utilization, memory utilization, processor power consumption).
Prerequisites
- Ensure that the user has a minimum privilege of
Login
.
| Inventory | URI | Description |
|---|---|---|
| System overview | /redfish/v1/Systems/{ComputerSystemId} |
A collection of endpoints to system node instances that are available in the inventory. |
| Memory overview | /redfish/v1/Systems/{ComputerSystemId}/Memory |
Information on memory device configuration such as capacity, total size, logical memory size, location and so on |
| Memory | /redfish/v1/Systems/<ComputerSystemId>/Memory/{memoryId} |
Configuration information of a memory. |
| MemoryDomains | /redfish/v1/Systems/{ComputerSystemId}/MemoryDomains |
Information on memory domain and its configuration |
| EthernetInterfaces | /redfish/v1/Systems/{ComputerSystemId}/EthernetInterfaces |
Information on Ethernet Interfaces or network interface controller(NIC). |
| EthernetInterface | /redfish/v1/Systems/{ComputerSystemId}/EthernetInterfaces/{EthernetInterfaceId} |
Information on a single, logical Ethernet Interface or network interface controller(NIC). |
| Bios | /redfish/v1/Systems/{ComputerSystemId}/bios |
System-specific information about a BIOS resource |
| SecureBoot | /redfish/v1/Systems/{ComputerSystemId}/SecureBoot |
Information on UEFI Secure Boot and managing the UEFI Secure Boot functionality of a system. |
| Storage subsystem | /redfish/v1/Systems/{ComputerSystemId}/Storage |
A storage subsystem is a set of storage controllers(physical or virtual) and the resources such as volumes that can be accessed from that subsystem. |
| Processors | /redfish/v1/Systems/{ComputerSystemId}/Processors |
|
| Single processor | /redfish/v1/Systems/{ComputerSystemId}/Processors/{processorId} |
The properties of a processor |
| NetworkInterface | /redfish/v1/Systems/{ComputerSystemId}/NetworkInterfaces |
A NetworkInterface contains links to NetworkAdapter, NetworkPort, and NetworkDeviceFunction resources. |
| Chassis | /redfish/v1/Chassis/{ComputerSystemId} |
Information on a specific Chassis instance. Chassis represents the physical components of a system - sheet-metal confined spaces, logical zones such as racks, enclosures, chassis and all other containers, and Subsystems (like sensors). |
| Network adapters | /redfish/v1/Chassis/{ComputerSystemId}/NetworkAdapters |
Information on NetworkAdapters. Some examples of NetworkAdapters include Ethernet, Fibre Channel, and converged network adapters. |
| Thermal | /redfish/v1/Chassis/{ComputerSystemId}/Thermal |
Information on the temperature and cooling of the entire Chassis. |
| Power | /redfish/v1/Chassis/{ComputerSystemId}/Power |
Information on processor power consumption and power limiting |
Search and filter
| Method | GET |
|---|---|
| URI | /redfish/v1/Systems?filter={searchKeys}%20{conditionKeys}%20{value} |
| Description | Use this endpoint to search servers based on a keyword, a condition, and a value which are combined as filter in the request. Two ore more filters can be combined in a single request with the help of logical operands. |
| Returns | Server endpoints based on the specified filter. |
| Response Code | 200 OK |
curl -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/redfish/v1/Systems?filter={searchKeys}%20{conditionKeys}%20{value}%20{logicalOperand}%20{searchKeys}%20{conditionKeys}%20{value}'
NOTE:
Ensure that the user has Login
privilege at the minimum.
Sample curl usage
curl -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'http://FODIM_IP_address/redfish/v1/Systems?filter=MemorySummary/TotalSystemMemoryGiB%20eq%20384'
Request URI Parameters
{searchkeys}
refers to ComputerSystem parameters. Following are the allowed search keys:
- "ProcessorSummary/Count"
- "ProcessorSummary/Model"
- "SystemType"
- "MemorySummary/TotalSystemMemoryGiB"
- " ProcessorSummary/sockets"
{conditionKeys}
refers to Redfish specified conditions. Following are the allowed condition keys:Condition Key Meaning "eq" Equal to "ne" Not equal to "gt" Greater than "ge" Greater than or equal to "le" Lesser than or equal to "lt" Lesser than {value}
refers to the actual value of the search parameter.{logicalOperands}
refers to the logical operands that are used to combine two or more filters in a request. Allowed logical operands areand
,or
, andnot
.
| Sample filter | Description |
|---|---|
Simple filter(without logical operand): filter=TotalSystemMemoryGiB%20eq%20384 |
This filter searches a server having total physical memory of 384 GB |
Compound filter(with logical operands): filter=(ProcessorSummary/Count%20eq%202%20and%20ProcessorSummary/Model%20eq%20intel)%20and%20(TotalSystemMemoryGiB%20eq%20384) |
This filter searches a server having total physical memory of 384 GB and Intel processor having the count of 2 |
Sample Response header
status:200
allow:"GET"cache-control:no-cache
content-type:application/json; charset=utf-8
etag:W/"12345"odata-version:4.0
x-frame-options:sameorigin
content-length:328 bytes
date:Tue,
05 Nov 2019 08:42:39 GMT+7m 7s
Sample Response body
{
"@odata.context":"/redfish/v1/$metadata#ComputerSystemCollection.ComputerSystemCollection",
"@odata.etag":"W/\"AA6D42B0\"",
"@odata.id":"/redfish/v1/Systems/",
"@odata.type":"#ComputerSystemCollection.ComputerSystemCollection",
"Description":"Computer Systems view",
"Name":"Computer Systems",
"Members":[
{
"@odata.id":"/redfish/v1/Systems/7ff3bd97-c41c-5de0-937d-85d390691b73:1"
}
],
"Members@odata.count":1
}
Use case for viewing the fabric inventory
Collection of fabrics
| Method | GET |
|---|---|
| URI | /redfish/v1/Fabrics |
| Description | A collection of references to simple fabrics. A simple fabric consist of switches, endpoints, and zones. |
| Returns | Links to the fabric instances. |
| Response Code | 200 OK on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://FODIM_IP_address/redfish/v1/Fabrics'
Sample Response header
allow:"GET"
cache-control:no-cache
content-length:228 bytes
content-type:application/json; charset=utf-8
date:Tue,05 Nov 2019 06:29:12 GMT+7m 6s
etag:W/"12345"
odata-version:4.0
status:200
x-frame-options:sameorigin
Sample Response body
{
"@odata.id":"/redfish/v1/Fabrics",
"Id":"FabricCollection",
"Members":[
"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5"
],
"Members@data.count":1,
"Name":"FabricCollection",
"RedfishVersion":"1.0.4",
"odata.type":"#FabricCollection.FabricCollection"
}
Single fabric instance
| Method | GET |
|---|---|
| URI | /redfish/v1/Fabrics/{fabricID} |
| Description | Schema representing a specific fabric. |
| Returns | Endpoints to various components contained in this fabric instance. |
| Response Code | 200 Ok on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://FODIM_IP_address/redfish/v1/Fabrics/{fabricID}'
Sample Response header
allow:"GET"
cache-control:no-cache
content-length:228 bytes
content-type:application/json; charset=utf-8
date:Tue,05 Nov 2019 06:29:12 GMT+7m 6s
etag:W/"12345"
odata-version:4.0
status:200
x-frame-options:sameorigin
Sample Response body
{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5",
"@odata.type":"#Fabric.v1_0_4.Fabric",
"AddressPools":{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/AddressPools"
},
"Description":"test",
"Endpoints":{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Endpoints"
},
"FabricType":"Ethernet",
"Id":"f4d1578a-d16f-43f2-bb81-cd6db8866db5",
"Name":"cfm-test",
"Status":{
"Health":"OK",
"State":"Enabled"
},
"Switches":{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches"
},
"Zones":{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Zones"
}
}
Collection of switches
| Method | GET |
|---|---|
| URI | /redfish/v1/Fabrics/{fabricID}/Switches |
| Description | A collection of references to the fabric switch instances contained in this fabric. |
| Returns | Links to the switch instances. |
| Response Code | 200 OK on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://FODIM_IP_address/redfish/v1/Fabrics/{fabricID}/Switches'
Sample Response header
allow:"GET"
cache-control:no-cache
content-length:228 bytes
content-type:application/json; charset=utf-8
date:Tue,05 Nov 2019 06:29:12 GMT+7m 6s
etag:W/"12345"
odata-version:4.0
status:200
x-frame-options:sameorigin
Sample Response body
{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches",
"Id":"SwitchCollection",
"Members":[
"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9",
"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/b9c165cf-a3e6-43c4-ac17-6e91d5792244"
],
"Members@data.count":2,
"Name":"SwitchCollection",
"odata.type":"#SwitchCollection.SwitchCollection"
}
Single Switch
| Method | GET |
|---|---|
| URI | /redfish/v1/Fabrics/{fabricID}/Switches/{switchID} |
| Description | Schema representing a particular fabric switch. |
| Returns | Properties of this switch and links to its ports. |
| Response Code | 200 OK on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://FODIM_IP_address/redfish/v1/Fabrics/{fabricID}/Switches/{switchID}'
Sample Response header
allow:"GET"
cache-control:no-cache
content-length:228 bytes
content-type:application/json; charset=utf-8
date:Tue,05 Nov 2019 06:29:12 GMT+7m 6s
etag:W/"12345"
odata-version:4.0
status:200
x-frame-options:sameorigin
Sample Response body
{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9",
"@odata.type":"#Switch.v1_1_2.Switch",
"Id":"c1b0ac48-e003-4d70-a707-450b128977d9",
"Manufacturer":"Switch <IP_ADDRESS>",
"Model":"ArubaOS-CX_OVA",
"Name":"Switch <IP_ADDRESS>",
"PartNumber":"OVA16FD88",
"Ports":{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9/Ports"
},
"SerialNumber":"OVA16FD88",
"Status":{
"Health":"UNKNOWN",
"State":"Enabled"
},
"SwitchType":"Ethernet"
}
Collection of ports
| Method | GET |
|---|---|
| URI | /redfish/v1/Fabrics/{fabricID}/Switches/{switchID}/Ports |
| Description | A collection of references to the ports for this switch. |
| Returns | Links to the port instances. |
| Response Code | 200 Ok on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://FODIM_IP_address/redfish/v1/Fabrics/{fabricID}/Switches/{switchID}/Ports'
Sample Response header
allow:"GET"
cache-control:no-cache
content-length:228 bytes
content-type:application/json; charset=utf-8
date:Tue,05 Nov 2019 06:29:12 GMT+7m 6s
etag:W/"12345"
odata-version:4.0
status:200
x-frame-options:sameorigin
Sample Response body
{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9/Ports",
"Id":"PortCollection",
"Members":[
"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9/Ports/0cb2ff96-b7a7-4627-a7b4-274d915f2524",
"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9/Ports/54096ea1-cfb8-4a6c-b7a3-d6263db729a6",
"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9/Ports/699b8f82-a6bf-47fa-a594-d73c95a8f81e",
"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9/Ports/7dd6b8c6-de72-4499-98dc-568a16e28a88",
"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9/Ports/9d097004-e034-4772-98c5-fa695688cc4d",
"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9/Ports/b82e663b-6d1e-43c9-9d49-63b68b2a5b06"
],
"Members@data.count":6,
"Name":"PortCollection",
"odata.type":"#PortCollection.PortCollection"
}
A single port
| Method | GET |
|---|---|
| URI | /redfish/v1/Fabrics/{fabricID}/Switches/{switchID}/Ports/{portid} |
| Description | Schema representing a specific port. |
| Returns | Properties of this port. |
| Response Code | 200 OK on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://FODIM_IP_address/redfish/v1/Fabrics/{fabricID}/Switches/{switchID}/Ports/{portid}'
Sample Response header
allow:"GET"
cache-control:no-cache
content-length:228 bytes
content-type:application/json; charset=utf-8
date:Tue,05 Nov 2019 06:29:12 GMT+7m 6s
etag:W/"12345"
odata-version:4.0
status:200
x-frame-options:sameorigin
Sample Response body
{
"@odata.id":"/redfish/v1/Fabrics/f4d1578a-d16f-43f2-bb81-cd6db8866db5/Switches/c1b0ac48-e003-4d70-a707-450b128977d9/Ports/0cb2ff96-b7a7-4627-a7b4-274d915f2524",
"@odata.type":"#Port.v1_1_2.Port",
"CurrentSpeedGbps":0,
"Description":"",
"Id":"0cb2ff96-b7a7-4627-a7b4-274d915f2524",
"MaxSpeedGbps":"qsfp_4x25_gbps",
"Name":"1/1/2",
"PortId":"1/1/2",
"PortProtocol":"Ethernet",
"PortType":"BidirectionalPort",
"Status":{
"Health":"",
"State":"down"
},
"Width":4
}
Managing tasks
A task represents an operation that takes more time than a user typically wants to wait and is carried out asynchronously.
An example of a task is resetting an aggregate of servers. Resetting all the servers in a group is a time-consuming operation; the user waiting for the result would be blocked from performing other operations. The FODIM creates Redfish tasks for such long-duration operations and offers an interface for the users to manage them while performing other operations.
The FODIM exposes Redfish TaskService APIs and Task monitor API. Use these endpoints to manage and monitor tasks till their completion.
Prerequisites
- Ensure that the user has
Login
privilege at the minimum.
Supported Endpoints
/redfish/v1/TaskService
/redfish/v1/TaskService/Tasks
/redfish/v1/TaskService/Tasks/{TaskID}
/taskmon/{TaskID}
Viewing a Collection of tasks
| Method | GET |
|---|---|
| URI | /redfish/v1/TaskService/Tasks |
| Description | A collection of tasks scheduled by or being executed by Redfish Task Service. |
| Returns | A list of task endpoints with task Ids. |
| Response Code | 200 on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/redfish/v1/TaskService/Tasks'
NOTE:
Only an admin
or a user with ConfigureUsers
privilege can view all the running tasks in the FODIM API at a given point of time. Other users can view tasks created only for their operations.
Sample Response header
allow:"GET"
cache-control:no-cache
content-length:345 bytes
content-type:application/json; charset=utf-8
date:Tue,05 Nov 2019 13:33:46 GMT+5h 37m
etag:W/"12345"
odata-version:4.0
status:200
x-frame-options:sameorigin
Sample Response body
{
"@odata.context":"/redfish/v1/$metadata#TaskCollection.TaskCollection",
"@odata.etag":"",
"@odata.id":"/redfish/v1/TaskService/Tasks",
"@odata.type":"#TaskCollection.TaskCollection",
"Name":"Task Collection",
"Description":"",
"Members@odata.count":3,
"Members":[
{
"@odata.id":"/redfish/v1/TaskService/Tasks/taskc8cf2e2e-6cb2-4e24-8512-247fa5d606b0"
},
{
"@odata.id":"/redfish/v1/TaskService/Tasks/taskc15aca5a-30a6-4618-adca-c25c889dc409"
},
{
"@odata.id":"/redfish/v1/TaskService/Tasks/task38d6df20-989f-4c05-ad0e-5939774bab7c"
}
]
}
Viewing information of a single task
| Method | GET |
|---|---|
| URI | /redfish/v1/TaskService/Tasks/{TaskID} |
| Description | A specific task scheduled by or being executed by Redfish Task Service. |
| Returns | Details of this task - task Id, name, state of the task, start time and end time( in case task is complete) of this task, completion percentage, URI of the task monitor associated with this task, sub-tasks if any. |
| Response Code | 200 on success |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
'https://{FODIM_IP_address}/redfish/v1/TaskService/Tasks/{TaskID}'
Sample Response header
allow:"GET"
cache-control:no-cache
content-length:345 bytes
content-type:application/json; charset=utf-8
date:Tue,05 Nov 2019 13:33:46 GMT+5h 37m
etag:W/"12345"
odata-version:4.0
status:200
x-frame-options:sameorigin
Sample Response body
{
"@odata.type":"#Task.v1_3_0.Task",
"Id":"taskc15aca5a-30a6-4618-adca-c25c889dc409",
"Name":"Task taskc15aca5a-30a6-4618-adca-c25c889dc409",
"Description":"",
"TaskState":"Completed",
"StartTime":"2019-11-13 13:50:51.711162494 +0530 IST",
"EndTime":"2019-11-13 08:21:26.64315461 +0000 UTC",
"TaskStatus":"OK",
"SubTasks":"/redfish/v1/Tasks/taskc15aca5a-30a6-4618-adca-c25c889dc409/SubTasks",
"TaskMonitor":"/taskmon/taskc15aca5a-30a6-4618-adca-c25c889dc409",
"PercentComplete":100,
"Payload":{
"HttpHeaders":{
"Content-type":"application/json; charset=utf-8",
"Location":"/redfish/v1/Systems/97d08f36-17f5-5918-8082-f5156618f58d:1"
},
"HttpOperation":"GET",
"JsonBody":{
"@odata.id":"/redfish/v1/Systems/97d08f36-17f5-5918-8082-f5156618f58d:1"
},
"TargetUri":"/redfish/v1/AggregationService/Actions/AggregationService.Add"
},
"Messages":null,
"@odata.context":"/redfish/v1/$metadata#Task.Task",
"@odata.id":"/redfish/v1/TaskService/Tasks/taskc15aca5a-30a6-4618-adca-c25c889dc409"
}
Monitoring a task through task monitor
| Method | GET |
|---|---|
| URI | /taskmon/{TaskID} |
| Description | Task monitor allows for polling a specific task for its completion. |
| Returns | Result of the operation carried out by the task monitor. |
| Response Code | - 202 until the task is complete. - 200, 201 on success. |
curl --insecure -X GET \
-H "X-Auth-Token:{X-Auth-Token}" \
-H "Content-Type:application/json" \
'https://{FODIM_IP_address}/taskmon/{TaskID}'
Subscribing to events
The FODIM offers an eventing interface that allows northbound clients to interact and receive notifications such as alarms from southbound equipment. It exposes Redfish EventService APIs as an interface for managing events.
Events are messages provided by the service to asynchronously notify the client of some significant state change or error condition, usually of a time critical nature.
Use these APIs to subscribe northbound clients to southbound events by creating a subscription entry in the service.
Prerequisites
Ensure that Kafka is installed.
Ensure that the user has an
administrator
role or aclient
role.
Supported Endpoints
redfish/v1/EventService
/redfish/v1/EventService/Subscriptions
Creating an event subscription
| Method | POST |
|---|---|
| URI | /redfish/v1/EventService/Subscriptions |
| Description | This endpoint subscribes one or more clients to an event by creating a subscription entry. |
| Returns | A Location header that contains a hyperlink to the newly created subscription.On success, a message in the JSON response body saying that the subscription is created. |
| Response Code | 201 |
curl --insecure -X POST \
-H "X-Auth-Token:{X-Auth-Token}" \
-H "Content-Type:application/json; charset=utf-8" \
-d \
'{
"Name": "subscription123",
"Destination": "https://<IP_ADDRESS>:10002/redfish/v1/EventService/",
"EventTypes": [
"Alert"
],
"Context": "ABCDEFGHJLKJ",
"Protocol": "Redfish",
"SubscriptionType": "RedfishEvent",
"EventFormatType": "Event",
"SubordinateResources": true,
"OriginResources": [
"/redfish/v1/Systems/{System Id}"
],
"Oem": {
"Hpe": {
"DeliveryRetryIntervalInSeconds": 30,
"RequestedMaxEventsToQueue": 20,
"DeliveryRetryAttempts": 5,
"RetireOldEventInMinutes": 10
}
}
}' \
'https://{FODIM_IP_address}/redfish/v1/EventService/Subscriptions/'
Sample Request body
{
"Name": "subscription123",
"Destination": "http://<IP_ADDRESS>:10002/redfish/v1/EventService/",
"EventTypes": [
"Alert"
],
"Context": "ABCDEFGHJLKJ",
"Protocol": "Redfish",
"SubscriptionType": "RedfishEvent",
"EventFormatType": "Event",
"SubordinateResources": true,
"OriginResources": [
"/redfish/v1/Systems/76632110-1c75-5a86-9cc2-471325983653:1"
],
"Oem": {
"Hpe": {
"DeliveryRetryIntervalInSeconds": 30,
"RequestedMaxEventsToQueue": 20,
"DeliveryRetryAttempts": 5,
"RetireOldEventInMinutes": 10
}
}
}
Request Parameters
| Parameter | Value | Attributes | Description |
|---|---|---|---|
| Name | string | Name of the subscription. | |
| Destination | string | read-only required on create |
The URI of the destination Event Service. |
| EventTypes | array (string (enum)) | read-only | The types of events that will be sent to the destination. |
| Context | string | read-write required (null) |
A client-supplied string that is stored with the event destination subscription. |
| Protocol | string (enum) | read-only required on create |
The protocol type of the event connection. |
| SubscriptionType | string (enum) | read-only required (null) |
Indicates the subscription type for events |
| EventFormatType | string (enum) | read-only | Indicates the content types of the message that this service can send to the event destination. |
| SubordinateResources | boolean | read-only (null) | This indicates if the service supports the SubordinateResource property on Event Subscriptions i.e.,subscription will be for events from the OriginsResources specified and also all subordinate resources. |
| OriginResources | array | A list of resources for which the service will only send related events. If this property is absent or the array is empty, then Events originating from any resource will be sent to the subscriber. |
Event Types
| string | Description |
|---|---|
| Alert | A condition exists which requires attention. |
| MetricReport | A metric report managed by the Telemetry Service is being sent. |
| Other | As of Redfish Specification v1.6, EventType has been deprecated. The event is therefore based on a Registry or Resource, not an EventType. |
| ResourceAdded | A resource has been added. |
| ResourceRemoved | A resource has been removed. |
| ResourceUpdated | The value of this resource has been updated. |
| StatusChange | The status of this resource has changed. |
EventFormatType
| string | Description |
|---|---|
| Event | The subscription destination will receive JSON Bodies of the Resource Type Event. |
| MetricReport | The subscription destination will receive JSON Bodies of the Resource Type MetricReport. |
SubscriptionType
| string | Description |
|---|---|
| RedfishEvent | The subscription follows the Redfish specification for event notifications, which is done by a service sending an HTTP POST to the subscriber's destination URI. |
| SSE | The subscription follows the HTML5 Server-Sent Event definition for event notifications. |
Protocol
| string | Description |
|---|---|
| Redfish | The destination follows the Redfish specification for event notifications. |
*Source : Redfish Resource and Schema Guide
Sample Response header
status: 201
cache-control: no-cache
content-type: application/json; charset=utf-8
etag: W/"12345"
**location: /redfish/v1/EventService/Subscriptions/7e60f5bf-439c-4e14-acfd-ab4155257484**
odata-version: 4.0
x-frame-options: sameorigin
content-length: 161 bytes
date: Thu, 14 Nov 2019 10:26:48 GMT+7m 17s
Sample Response body
{
"error":{
"@Message.ExtendedInfo":[
{
"MessageId":"Base.1.0.Created"
}
],
"code":"iLO.0.10.ExtendedInfo",
"message":"See @Message.ExtendedInfo for more information."
}
}
End-to-end use cases
The basic use cases for the FODIM API include:
Creating a user account
Users other than
admin
need to create a user account by specifying a username, password, and a role before they can create a login session with the FODIM API.For examples, consult "Creating and managing user accounts" section.
Creating a login session
Create a login session with the FODIM API to obtain an
X-AUTH-TOKEN
which is required to authenticate subsequent requests(skip this if you choose Basic authetication method).For examples, consult "Creating and managing sessions" section.
Adding the resources that you want to manage
Add all the resources to be managed one by one. The FODIM API builds a detailed inventory of every resource that is added.
For examples, consult "Aggregating and managing southbound equipment" section.
Searching and viewing the resource inventory information
The resource inventory contains crucial system details such as CPU details, memory details, chassis, power details. You can search the inventory based on a specific system parameter.
For examples, consult "Accessing the inventory of a managed southbound resource" section.
Managing the resource: performing actions on the resource
Perform actions such as resetting, changing the boot order to default settings.
For examples, consult "Aggregating and managing southbound equipment" section.
Deleting a resource that is no longer managed
Delete resources that you do not want to manage anymore.
For examples, consult "Aggregating and managing southbound equipment" section.
Managing tasks
View and monitor a list of running tasks initiated by the user such as adding a resource, resetting, deleting.
For examples, consult "Managing tasks" section.
Subscribing to events
Get notified of alarms from the southbound resources.
For examples, consult Subscribing northbound clients to southbound events section.


Kevin: sooo league?

Jamesh: [image]


{% extends "layout/base.html" %} {% block head %} {% endblock %} {% block content %}
Probability of successful funding: |
{{(100*kickwin)|round(1)}}% | {{(100*indiewin)|round(1)}}% |
Expected pledges |
${{(kickcash)|round(2)}} ({{100*(kick_percent)|round(2)}}% of goal) |
${{(indiecash)|round(2)}} ({{100*(indie_percent)|round(2)}}% of goal) |
|
|
| {{verdict}} |


The weirdest lights you will see this holiday season.
The lights mostly occur between Guadalupe and Home St on 37th. Entering 519 W 37th St, Austin, TX 78705 or La Tazza Fresca into your GPS will get you here. The best house though is actually on the corner of 35th Street and Cedar just around the corner at the end of the block.
The best way to experience the lights is to walk it as the street becomes backed up with cars and many of the coolest things can only be seen by walking off the street a bit. Especially the Stuffed Animal Petting Zoo which is a must see.
We are an all volunteer group of neighbors that put on the lights. Your donations help us put it on and keep it going. About half the block are renters and we/they especially appreciate the donations as many are students and funds are tight.
We prefer donations of equipment, especially:
We do accept small paypal donations, though we are not a 501(c)3 so we cannot offer any form of tax breaks. Shoot us an email and we can provide you the link.


R/bioRad.R
Class for vertical profiles
# S3 method for vp summary(object, ...) is.vp(x) # S3 method for vp dim(x)
| object | object of class 'vp' |
|---|---|
| ... | additional arguments affecting the summary produced. |
| x | object of class 'vp' |
for is.vp
: TRUE
if its argument is of class "vp
"
for dim.vp
: dimensions of the profile data
An object of class vp
contains a vertical profile. A vertical profile contains a collection of quantities,
with each quantity having values at different altitude layers above the earth's surface,
typically equally spaced altitudinal layers.
Data contained in this class object should be accessed with the fetch function.
Information stored under attributes
(see below) can be accessed directly.
A vp
object is a list containing
radar
the radar identifier
datetime
the nominal time of the profile
data
the profile data, a list containing:
HGHT
height above mean sea level [m]. Alt. bin from HGHT to HGHT+interval)
u
speed component west to east [m/s]
v
speed component north to south [m/s]
w
vertical speed (unreliable!) [m/s]
ff
horizontal speed [m/s]
dd
direction [degrees, clockwise from north]
sd_vvp
VVP radial velocity standard deviation [m/s]
gap
Angular data gap detected [T/F]
dbz
Bird reflectivity factor [dBZ]
eta
Bird reflectivity [cm^2/km^3]
dens
Bird density [birds/km^3]
DBZH
Total reflectivity factor (bio+meteo scattering) [dBZ]
n
number of points VVP bird velocity analysis (u,v,w,ff,dd)
n_all
number of points VVP st.dev. estimate (sd_vvp)
n_dbz
number of points bird density estimate (dbz,eta,dens)
n_dbz_all
number of points total reflectivity estimate (DBZH)
attributes
list with the profile's \what
, \where
and \how
attributes


--- layout: default title: Stinger Games subtitle: Stinger Games section: index style: dark --- {% for post in site.posts limit:4 %}


version
This is a complete overview of your current Disco setup.
Hosts
of (Available / Total)
Workers
Disk Space
used / free


GitHub Contributions Drawer
Name
E-mail
Commit Message
File Name
Text To Append
Commits Density
Toggle Contribution Details
Generate


Pat's Cookie Sales
Home Page
6:00am
7:00am
8:00am
9:00am
10:00am
11:00am
12:00pm
1:00pm
2:00pm
3:00pm
4:00pm
5:00pm
6:00pm
7:00pm
Daily Location Total
Add a new store
Store name:
Minimum number of customers:
Maximum number of customers:
Average number of cookies:


Ingredients:
| Amount | Ingredient | |
|---|---|---|
| 16 oz | Extra firm tofu | |
| 2 tablespoons | Cornstarch | |
| 1 tablespoon | Sesame oil |
For the Sauce:
| Amount | Ingredient | |
|---|---|---|
| 1⁄4 cup | Soy sauce | |
| 2 tablespoons | Water | |
| 1⁄2 teaspoon | Rice wine vinegar | |
| 2 teaspoons | Cornstarch | |
| 1 1⁄2 teaspoons | Chilli garlic sauce | |
| 2 teaspoons | Honey |
Instructions:
| 1. | Press tofu for 30 minutes. | |
| 2. | Slice tofu into cubes and cover all pieces with cornstarch. | |
| 3. | Add sesame oil to a pan and brown the tofu cubes on all sides over medium heat. | |
| 4. | Mix together the ingredients for the sauce. | |
| 5. | Once the tofu has browned and crisped, coat the tofu with the sauce and heat for 5 minutes. |


An afternoon of reading derived from a search for articles about Drush and Jenkins
Plugins
Relevant Blogs
Jenkins Job Template for Drupal Projects
How-To's
- Drupal and Jenkins: continuous integration howto
- Drupal 7 tip: How to automate and control your go live checklist
- Using Jenkins CI and Drupal
- Drupal Continuous Integration with Jenkins, a How-To Slideshow
SimpleTest and PHPUnit
- Drush, Simpletest, and continuous integration for Drupal using Jenkins
- Optimize simpletest jUnit xml output for use in Jenkins
- upal
- Running tests with Drupal
Phing and Drush
- Phing Orchestrated Drupal Site Builds
- Jenkins and Phing templates for continuous integration
- Phing Drush Task
Testing the User Interface
Validating php, html, js and css
- Coder
- Drupal's test suite based on PHPUnit
- W3C Download and Install the CSS Validator
- W3C Markup Validator Web Service API


|
||||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |
| Interface Summary | |
|---|---|
| AbstractContentSelector.ContentSelectorFactory | An interface for content selector factories. |
| BindingListener | The interface for listening to binding changes on bindable elements. |
| ContentSelectionChangedListener | The interface for listening to changes in selected nodes on an xbl:content element. |
| SVG12BridgeUpdateHandler | A BridgeUpdateHandler interface for SVG 1.2 specific events. |
| Class Summary | |
|---|---|
| AbstractContentSelector | A base class for handlers of different XBL content element includes attribute syntaxes. |
| AbstractContentSelector.XPathPatternContentSelectorFactory | A factory for XPathPatternContentSelector objects. |
| AbstractContentSelector.XPathSubsetContentSelectorFactory | A factory for XPathSubsetContentSelector objects. |
| BindableElementBridge | Bridge class for foreign namespace elements that can be bound with sXBL. |
| ContentManager | A class to manage all XBL content elements in a shadow tree. |
| ContentSelectionChangedEvent | An event to signify a change to the list of selected nodes for an xbl;content element. |
| DefaultContentSelector | A class to handle content selection when the includes attribute is not present. |
| DefaultXBLManager | A full featured sXBL manager. |
| SVG12BridgeContext | Bridge context for SVG 1.2 documents. |
| SVG12BridgeContext.ImplementationEventListenerMememto | A class used to store an implementation EventListener added to the DOM. |
| SVG12BridgeEventSupport | This class is responsible for tracking GraphicsNodeMouseEvents and forwarding them to the DOM as regular DOM MouseEvents. |
| SVG12BridgeEventSupport.Listener | A GraphicsNodeMouseListener that dispatch DOM events accordingly. |
| SVG12BridgeExtension | This is a Service interface for classes that want to extend the functionality of the Bridge, to support new tags in the rendering tree. |
| SVG12FocusManager | Focus manager for SVG 1.2 documents. |
| SVG12ScriptingEnvironment | Manages scripting handlers for SVG 1.2 'handler' elements. |
| SVG12TextElementBridge | Bridge class for SVG 'text' elements with support for text content that has been specified with XBL. |
| SVG12URIResolver | A URIResolver for SVG 1.2 documents. |
| SVGFlowRootElementBridge | Bridge class for the <flowRoot> element. |
| SVGMultiImageElementBridge | Bridge class for the <multiImage> element. |
| SVGMultiImageElementBridge.MultiImageElementViewport | A viewport defined an <svg> element. |
| SVGSolidColorElementBridge | Bridge class for a regular polygon element. |
| XBLContentElementBridge | Bridge class for the <xbl:content> element. |
| XBLShadowTreeElementBridge | Bridge class for the <xbl:shadowTree> element. |
| XPathPatternContentSelector | A class to handle the XPath Pattern syntax for XBL content elements. |
| XPathSubsetContentSelector | A class to handle the XPath subset syntax for XBL content elements. |
| XPathSubsetContentSelector.Scanner | A scanner for XPath subset selectors. |
|
||||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |


My Team
adf
Manager
ID: adf
Email:
adf
Office number: ad
adf
Engineer
ID: adf
Email:
adf
GitHub:
dbradle4348
adf
Intern
ID: adf
Email:
adf
School: adf


Click on the right side of the gutter, then click again below, the code between will collapse. Click on either arrow to expand. To use, simply include the collapserange.js file and set collapseRange: true in options.
collapseRange: true


Click the button to select the wallet backup file:
This is the BIP39 seed phrase of the chosen wallet backup file:
Wallet / backup name:
It was created on the following date:
Using BitBox02 firmware version:
The BitBox02 generates wallet addresses according to the BIP32 and BIP44 specifications. With m denoting the extended master key according to BIP32, BIP44 specifies the following key derivation: m / purpose' / coin_type' / account' / change / address_index.
The BitBox02 sets the purpose as follows:
Coin_type is set in accordance with SLIP44:
The first account is identified with 0. The firmware of the BitBox02 limits the account number to 99, allowing at most 100 accounts.
The BitBox02 uses 0 for normal receive addresses and 1 for change addresses according to BIP44.
Wallet software increment the address index from 0. The BitBoxApp respects a gap limit of 20 unused receive addresses according to BIP44. The gap limit for change addresses is 6 in order to be compatible with Electrum. (For the legacy account, the receive gap limit is 60 and the change gap limit is 25 for historical reasons, but the BitBox02 doesn't support legacy transactions.) As the gap limit cannot be enforced by the BitBox02, the firmware rejects address indexes higher than 9999, allowing at most 10'000 addresses for both the internal and the external chain.


{include file="common/plugins" /}
Release Note
About Web UI
About ATS Starter
About Manual
{include file="common/footer" /}


Version 0.5
This class is still very much a work in progress, I will not make any claims about it always providing correct sql or even giving useful error messages when it does not. However I found it very useful in a number of applications I have done on the web. Further comments in the source code for class.tfm.sqlquery.inc . Contact me with with queries, suggestions, or additions. I hope someone finds it useful. If you redistribute it or use it in an application, please at least keep my copyright notice in place.
Security
I am aware that passing fieldnames around in POST data is a security risk, there are probably numerous ways around this.
This page provides a form with various options for using the class. I've tried to include comments with each form indicating what particular aspect of the class it is using.
Basic Form
Join Form
Join Form with Alias
Lots more fields
Extensive use of aliases
I copied this from a webform I'm using it in, so my apologies that it is horribly formatted, and probably a bit difficult to understand, but basically this uses aliases extensively. In order for the user to be able to choose which fields they want to search on each select is simply named aliasField0, aliasField1 etc, with the value then assigned by the user on selection. the operator is then named fldField0_Operator, fldField1_Operator, and the same with the value. So the form is submitted with a whole load of alias fields, and the values assigned to them via the select boxes and fldField0_Opertor and fldField0_Value etc.
The class then replaces all the aliases providing the correct sql.
This form also uses the Prefix facility, If you provide a value for the Total Cost field you will see it provides a second sql statement using only the fields in the form prefixed with 'Total'.


{% extends 'layout-cookies.html' %} {% block pageTitle %} Get help to buy food and milk (Healthy Start) {% endblock %} {% block content %}
If you’re at least 10 weeks pregnant or have a child under 4 years old, you could get help to buy milk, fruit and vegetables.

Start now


Apples
No explicit default was set, so per standard functionality
this first tabpanel
will be shown by default.
Here's a link just to test keyboard tabbing.
(it's odd talking about tab
s, and tabs.)
Bananas
This is an example of a heading being used to populate the
tab
's label, while also not removing heading
from the tabpanel
. This is done by adding
the value "keep" to data-atabs-heading
.
There are two headings here
The tab
is getting its label from the
data-atabs-tab-label
. The heading is
kept in the tabpanel
because it does
not have the data-atabs-heading
attribute.
It wouldn't make much sense
If the contents of a tabpanel
contain
additional sub headings, it wouldn't make sense to remove
the initial heading from the tabpanel
.
Doing so would create a gap in the heading structure.
Special demo: enabled a disabled tab
There are some cases, e.g. in a multi-step process, where a user completes a task in an exposed tab panel or panels, and then by completion of that task a previously disabled tab becomes enabled.
The following button showcases how that could be implemented for the disabled "Mangos" tab.
Mangos (out of stock)
This text will never be visible, unless the tab is enabled via JS. Please refer to the demo button in the "Oranges" tab for an example how this could be achieved.


John Winters
Software Engineer
Education
- Master's in Computer Science - University of Missouri Columbia
- Bachelor's in Computer Science - University of Missouri Columbia
- Minor in Math
- Minor in Information Technologies
- Soon to be Code Fellows
Experience
- Check back later!
Summary
Wanna be powerlifter whose also attempting to change the world via Software.
Always working on improving Quality of Experience whether in life or programming.Goals
- Becoming a better programmer
- Hit 200/300/400/500 for OHP/Bench/Squat/Deadlift
- Get a bigger house and another puppy
- Learn the best ways to commute around Seattle


Uninstalling DIScover
DIScover provides an uninstall application that removes it from your computer. This application removes all files that DIScover installed. Unless files were generated below the DIScover directory, the uninstall procedure removes the DIScover directory.
Log files remain even after an uninstall procedure. The advantage to this is that any customized preferences or any private information model data remains intact should you need to reinstall or upgrade DIScover. Uninstall is an application similar to the installation application.
Related Topics


This is the guidance for the Green Theorem visualisation.
The graph shows a 2D arbitrary surface bounded by an anticlockwise oriented loop.
By click on the "Play" button, the surface will be sliced into several smaller pieces, each bounded by an anticlockwise oriented loop. The inner arrows will cancel with each other. And hence the sole effect of piling up the microscopic circulations will be the macroscopic circulation.
More details are shown here.
Have fun!
Similarly, any arbitrary shape can be cut in to small pieces, with microscopic circulation existing on each of them.
From the animation on the right hand side, every arrows inside the grid will cancel with an arrow with opposite
direction. In other words, all the magenta arrows will
cancel each other and we are left with black arrows.
This again demonstrates the relationship between the microscopic circulation and the macroscopic circulation. Therefore Green's theorem can
be apply on any positively oriented, piecewise smooth, simple closed arbitrary curves.


{{me.name}} {{votes.heartSize - votes.needed}} out of {{votes.heartSize}} games are played for {{game.name}} to write a check of {{votes.donationPer * votes.heartSize}}$ for {{pickedCharity.name}}!


About Pet Valet
Pet Valet is essentially a dog walking service in which a dog owner can call for a dog walk and have a walker arrive in minutes, with the transaction occuring on the mobile website.
Pet Valet was developed by Kathryn Moran and Carolyn Mei during the Girls Who Code Summer Immersion Program at Microsoft Chicago, and they are very excited to welcome you to use their service.
About Girls Who Code
Girls Who Code is a nonprofit organization which aims to support and increase the number of women in computer science. The organization runs summer programs which teach computing and programming skills to high school girls.
About Kathryn Moran
Kathryn Moran is a cool cat! She loves running, eating, and coding, and she's greatly enjoyed her time spent at Girls Who Code!
About Carolyn Mei
Carolyn is a student at Whitney Young. She's 200% dead 200% of the time. Ripperoni!