Implemented idmlite REST tests. Added library to support tests.
[integration/test.git] / test / csit / suites / aaa / idmlite / 010_CRUD_Rest_CommandsTests.robot
diff --git a/test/csit/suites/aaa/idmlite/010_CRUD_Rest_CommandsTests.robot b/test/csit/suites/aaa/idmlite/010_CRUD_Rest_CommandsTests.robot
new file mode 100644 (file)
index 0000000..bf298bc
--- /dev/null
@@ -0,0 +1,766 @@
+*** Settings ***
+Documentation     Basic REST AAA Tests for IdMLight
+...
+...               Copyright (c) 2015 Hewlett-Packard Development Company, L.P. and others. All rights reserved.
+...
+...               This program and the accompanying materials are made available under the
+...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
+...               and is available at http://www.eclipse.org/legal/ep1-v10.html
+Suite Setup       IdMLight Suite Setup
+Suite Teardown    IdMLight Suite Teardown
+Library           Collections
+Library           RequestsLibrary
+Library           OperatingSystem
+Library           String
+Library           HttpLibrary.HTTP
+Library           DateTime
+Library           ../../../libraries/Common.py
+Library           ../../../libraries/AAAJsonUtils.py
+Resource          ../../../libraries/Utils.txt
+Variables         ../../../variables/Variables.py
+Resource          ../../../libraries/AAAKeywords.txt
+
+*** Variables ***
+# port is fixed in Jetty configuration, as well
+${URI}            http://${CONTROLLER}:8282
+# create lists for Domains, Roles and Users - that can be cleaned up upon Teardown
+@{cleanup_domain_list}
+@{cleanup_role_list}
+@{cleanup_user_list}
+@{cleanup_grant_list}
+# will modify value in Setup and use throughout the code
+${HEADERS}        ${EMPTY}
+
+*** Test Cases ***
+Test Post New Domain
+    [Documentation]    Create a domain using REST POST command.
+    # create a temp name, set it to domainName
+    ${domainName}=    Create Random Name    domain-Other
+    # Create the new domain, initialize some values to test against
+    ${domaindesc}=    Set Variable    "testdomain other"
+    ${domainstatus}=    Set Variable    "true"
+
+    # Have to escape the quotes, need quotes to make the POST work properly
+    ${data}=    Set Variable    {"description":${domaindesc},"domainid":"7","name":\"${domainName}\","enabled":${domainstatus}}
+    Log    ${data}
+    # now post it
+    ${domain}=    Post New Domain    ${domainName}    ${data}
+    Log    ${domain}
+
+    ${domainid}=    Parse Item From Blob By Offset    ${domain}    0
+    Log    ${domainid}
+
+    # get the domain to verify
+    ${fetched_domain}=    Get Specific Domain    ${domainid}
+    # add new domain json string to the cleanup list for later cleanup
+    Append To List    ${cleanup_domain_list}    ${fetched_domain}
+    # count the number of domainid's that appear in this block of JSON
+    ${depth}=    Fieldcount    ${fetched_domain}    "domainid"
+    ${fetchedDomStatus}=    Get Domain State By Domainid    ${domain}    ${domainid}    ${depth}
+    ${fetchedDomDesc}=    Get Domain Description By Domainid    ${domain}    ${domainid}    ${depth}
+    # Set Test Disposition based on comparison of what was posted and what was fetched
+    ${testdisposition}=    Set Variable If    '${fetched_domain}' == '${domain}'    '${fetchedDomStatus}' == '${domainstatus}'    '${fetchedDomDesc}' == '${domaindesc}'
+    Log    ${testdisposition}
+
+Test Get Domains
+    [Documentation]    Exercise REST GET command to get all domains.
+    # rely on the creation of a test role in the Setup routine
+    # pop item off of end of the cleanup list, for use (does not alter list)
+    Log    ${cleanup_domain_list}
+    ${domain_item}=    Get From List    ${cleanup_domain_list}    -1
+    Log    ${domain_item}
+
+    # parse out the domainid from the domain info we just grabbed
+    ${domainid}=    Parse Item From Blob By Offset    ${domain_item}    0
+    Log    ${domainid}
+
+    # parse out the name from the same info
+    ${domainname}=    Parse Item From Blob By Offset    ${domain_item}    1
+    Log    ${domainname}
+
+    # get the entire dump of created domains
+    ${content}=    Get Domains
+
+    # parse through that massive blob and get the individual name created in Setup
+    ${node_count}=    Nodecount    ${content}    domains    domainid
+    ${domainid}=    Convert To Integer    ${domainid}
+
+    # Get the domain name from the database, looking it up by its domainid
+    ${domainentry}=    Get Domain Name By Domainid    ${content}    ${domainid}    ${node_count}
+
+    Log    ${domainentry}
+    # compare to see if the parsed user id matches the one we grabbed from list
+    Should Be Equal    ${domainentry}    ${domainname}
+
+Test Get Specific Domain
+    [Documentation]    Get a specific domain using REST GET command.
+    # from the pre-created (see Setup routine) list, grab a domain id for testing
+    ${listlength}=    Get Length    ${cleanup_domain_list}
+    # pop item off of end of the list, for use (does not alter list)
+    Log    ${cleanup_domain_list}
+    ${domain_item}=    Get From List    ${cleanup_domain_list}    -1
+    ${item}=    Pop Name Off Json    ${domain_item}
+    # convert this crap to unicode
+    # ${item}=    Convert To String    ${item}
+    Log    ${item}
+    # make a GET call to find the material we want to delete
+    ${domains}=    Get Domains
+    # convert name on the list to an ID, by which we delete this stuff
+    ${node_count}=    Nodecount    ${domains}    domains    domainid
+    ${node_count}=    Convert To Integer    ${node_count}
+    ${domainid}=    Get Domain Id By Domainname    ${domains}    ${item}    ${node_count}
+    # now, get the specific domain by it's domainid
+    ${domaininfo}=    Get Specific Domain    ${domainid}
+    Should Contain    ${domaininfo}    ${item}
+    Log    ${domaininfo}
+
+Test Update Specific Domain
+    [Documentation]    Update a specific domain using REST PUT command.
+    # rely on the creation of a test domain in the Setup routine
+    # pop item off of end of the list, for use (does not alter list)
+    Log    ${cleanup_domain_list}
+    ${domain_item}=    Get From List    ${cleanup_domain_list}    -1
+    Log    ${domain_item}
+
+    # parse out the domain id from the domain info we just grabbed
+    ${domid}=    Parse Item From Blob By Offset    ${domain_item}    0
+    Log    ${domid}
+
+    # parse out the name from the same info
+    ${domname}=    Parse Item From Blob By Offset    ${domain_item}    1
+    Log    ${domname}
+
+    ${data}=    Set Variable    {"name":"MasterTest Domain"}
+    Update Specific Domain    ${data}    ${domid}
+    ${domname}=    Get Specific Domain Name    ${domid}
+    Log    ${domname}
+    ${z}=    Split String    ${data}    :
+    ${dname}=    Get From List    ${z}    1
+    ${dname}=    Replace String    ${dname}    "    ${EMPTY}
+    ${dname}=    Replace String    ${dname}    }    ${EMPTY}
+    Log    ${dname}
+    ${modified_name}=    Pop Name Off Json    ${domname}
+    Log    ${modified_name}
+    Should Be Equal    ${dname}    ${modified_name}
+
+Test Delete Domain
+    [Documentation]    Delete a specific domain using REST DELETE command.
+    # create a temporary test domain
+    ${tempdomain}=    Create Random Name    temp-domain-name
+    ${domaindata}=    Set Variable    {"description":"temporary test domain","domainid":"1","name":"${tempdomain}","enabled":"true"}
+    # Post that temp domain
+    ${newdomain}=    Post New Domain    ${tempdomain}    ${domaindata}
+    Log    ${newdomain}
+    # parse out the domain-id from the domain info we just created
+    ${domainid}=    Parse Item From Blob By Offset    ${newdomain}    0
+    Log    ${domainid}
+
+    # now wipe if off the map
+    Delete Domain    ${domainid}
+    # we should not be able to fetch this domain from the database of domains...should fail...
+    ${content}=    Check Specific Id Does Not Exist    domain    ${domainid}
+    Log    ${content}
+
+Test Get Users
+    [Documentation]    Exercise REST GET command for obtaining all users.
+    # rely on the creation of a test user in the Setup routine
+    # pop item off of end of the list, for use (does not alter list)
+    Log    ${cleanup_user_list}
+    ${user_item}=    Get From List    ${cleanup_user_list}    -1
+    Log    ${user_item}
+
+    # parse out the userid from the user info we just grabbed
+    ${userid}=    Parse Item From Blob By Offset    ${user_item}    0
+    Log    ${userid}
+
+    # parse out the name from the same info
+    ${username}=    Parse Item From Blob By Offset    ${user_item}    1
+    Log    ${username}
+
+    # get the entire blob of users
+    ${content}=    Get Users
+    # parse through that massive blob and get the individual name
+    ${node_count}=    Nodecount    ${content}    users    userid
+    ${userid}=    Convert To Integer    ${userid}
+    ${userentry}=    Get User Name By Userid    ${content}    ${userid}    ${node_count}
+    Log    ${userentry}
+    # compare to see if the parsed user id matches the one we grabbed from list
+    Should Be Equal    ${userentry}    ${username}
+
+Test Get Specific User
+    [Documentation]    Exercise REST GET command to obtain a specific user.
+    # from the pre-created (see Setup routine) list, grab a user id for testing
+    ${listlength}=    Get Length    ${cleanup_user_list}
+    # pop item off of end of the list, for use (does not alter list)
+    Log    ${cleanup_user_list}
+    ${user_item}=    Get From List    ${cleanup_user_list}    -1
+    ${item}=    Pop Name Off Json    ${user_item}
+    # convert this to unicode
+    # ${item}=    Convert To String    ${item}
+    Log    ${item}
+
+    # parse out the userid from the user info we just grabbed
+    ${userid}=    Parse Item From Blob By Offset    ${user_item}    0
+    Log    ${userid}
+
+    # parse out the name from the same info
+    ${username}=    Parse Item From Blob By Offset    ${user_item}    1
+    Log    ${username}
+
+    # make a GET call to find the material we want
+    ${content}=    Get Specific User    ${userid}
+
+    # parse out the user name from the content we just fetched
+    ${fetched_username}=    Parse Item From Blob By Offset    ${content}    1
+    Log    ${fetched_username}
+
+    # compare to see if the parsed user name matches the one we grabbed from list
+    Should Contain    ${fetched_username}    ${username}
+
+Test Update User
+    [Documentation]    Exercise PUT command against an existing User ID.
+    # pop item off of end of the list, for use (does not alter list)
+    Log    ${cleanup_user_list}
+    ${user_item}=    Get From List    ${cleanup_user_list}    -1
+    Log    ${user_item}
+
+    # parse out the user-id from the user info we just created
+    ${userid}=    Parse Item From Blob By Offset    ${user_item}    0
+    Log    ${userid}
+
+    # update the information for the userid
+    ${testusername}=    Create Random Name    force-accomplish
+    ${data}=    Set Variable    {"description":"sample test description", "name":"${testusername}"}
+    ${content}=    Update Specific User    ${data}    ${userid}
+    Log    ${testusername}
+    # now, make a GET call to find the material we modified
+    ${existing_useritem}=    Get Specific User    ${userid}
+
+    # parse out the name from the existing userinfo
+    ${expected_username}=    Parse Item From Blob By Offset    ${existing_useritem}    1
+    Log    ${expected_username}
+
+    # compare to see if the GOTTEN user id matches the one we grabbed from list
+    Should Be Equal    ${expected_username}    ${testusername}
+
+Test Post New User
+    [Documentation]    Test the POST command to create a new user.
+    # create information for a new role (for the test)
+    ${testusername}=    Create Random Name    Darth-Maul
+    ${data}=    Set Variable    {"description":"sample user description", "name":"${testusername}", "userid":1}
+    Log    ${testusername}
+
+    # Post this puppy
+    ${content}=    Post New User    ${testusername}    ${data}
+    # parse out the userid from the content we just created
+    ${userid}=    Parse Item From Blob By Offset    ${content}    0
+    Log    ${userid}
+
+    # now go GET the userid info and compare to the name we fabricated
+    ${existing_useritem}=    Get Specific User    ${userid}
+
+    ${expected_username}=    Parse Item From Blob By Offset    ${existing_useritem}    1
+    Log    ${expected_username}
+
+    # compare to see if the GOTTEN role id matches the one we grabbed from list
+    Should Be Equal    ${expected_username}    ${testusername}
+
+Test Delete User
+    [Documentation]    Exercise REST command for DELETE user command.
+    # create a user and then delete it.    Use Get to verify it's gone
+    # create information for a new user (for the test)
+    ${testusername}=    Create Random Name    force-user
+    ${data}=    Set Variable    {"description":"sample test description", "name":"${testusername}", "userid":1}
+    Log    ${testusername}
+    # Post this disposable user
+    ${content}=    Post New User    ${testusername}    ${data}
+    # parse out the user-id from the content we just created
+    ${userid}=    Parse Item From Blob By Offset    ${content}    0
+    Log    ${userid}
+
+    # now delete it...
+    ${content2}=    Delete User    ${userid}
+    # should fail...
+    ${content}=    Check Specific Id Does Not Exist    user    ${userid}
+    Log    ${content}
+
+Test Get Specific Role
+    [Documentation]    Exercise REST command for roles GET command.
+    # from the pre-created (see Setup routine) list, grab a role id for testing
+    ${listlength}=    Get Length    ${cleanup_role_list}
+    # pop item off of end of the list, for use (does not alter list)
+    Log    ${cleanup_role_list}
+    ${role_item}=    Get From List    ${cleanup_role_list}    -1
+    Log    ${role_item}
+    # parse out the role-id from the role info we just created
+    ${roleid}=    Parse Item From Blob By Offset    ${roleitem}    0
+    Log    ${roleid}
+
+    # make a GET call to find the material we want
+    ${existing_roleitem}=    Get Specific Role    ${roleid}
+
+    # parse out the expected role-id from the content we just created
+    ${eroleid}=    Parse Item From Blob By Offset    ${existing_roleitem}    0
+    Log    ${eroleid}
+    # compare to see if the GOTTEN role id matches the one we grabbed from list
+    Should Be Equal    ${eroleid}    ${roleid}
+
+Test Get Roles
+    [Documentation]    Exercise REST command for roles GET command.
+    # rely on the creation of a test role in the Setup routine
+    # pop item off of end of the list, for use (does not alter list)
+    Log    ${cleanup_role_list}
+    ${role_item}=    Get From List    ${cleanup_role_list}    -1
+    Log    ${role_item}
+
+    # parse out the role-id from the info we just grabbed
+    ${roleid}=    Parse Item From Blob By Offset    ${role_item}    0
+    Log    ${roleid}
+    # parse out the name from the same info
+    ${rolename}=    Parse Item From Blob By Offset    ${role_item}    1
+    Log    ${rolename}
+
+    # get the entire blob of roles
+    ${content}=    Get Roles
+    # parse through that massive blob and get the individual name
+    ${node_count}=    Nodecount    ${content}    roles    roleid
+    ${roleid}=    Convert To Integer    ${roleid}
+    ${roleentry}=    Get Role Name By Roleid    ${content}    ${roleid}    ${node_count}
+    Log    ${roleentry}
+    # compare to see if the parsed user id matches the one we grabbed from list
+    Should Be Equal    ${roleentry}    ${rolename}
+
+Test Update Role
+    [Documentation]    Exercise PUT command against an existing Role ID.
+    # pop item off of end of the list, for use (does not alter list)
+    Log    ${cleanup_role_list}
+    ${role_item}=    Get From List    ${cleanup_role_list}    -1
+    Log    ${role_item}
+    # parse out the role-id from the role info we just created
+    ${roleid}=    Parse Item From Blob By Offset    ${role_item}    0
+    Log    ${roleid}
+
+    # update the information for the roleid
+    ${testrolename}=    Create Random Name    force-accomplish
+    ${data}=    Set Variable    {"description":"sample test description", "name":"${testrolename}"}
+    ${content}=    Update Specific Role    ${data}    ${roleid}
+    Log    ${testrolename}
+    # now, make a GET call to find the material we modified
+    ${existing_roleitem}=    Get Specific Role    ${roleid}
+
+    # parse out the name from the same info
+    ${expected_rolename}=    Parse Item From Blob By Offset    ${existing_roleitem}    1
+    Log    ${expected_rolename}
+
+    # compare to see if the GOTTEN role id matches the one we grabbed from list
+    Should Be Equal    ${expected_rolename}    ${testrolename}
+
+Test Post New Role
+    [Documentation]    Exercise POST command to create a new Role.
+    # create information for a new role (for the test)
+    ${testrolename}=    Create Random Name    force-brother-cousin
+    ${data}=    Set Variable    {"description":"sample test description", "name":"${testrolename}", "roleid":1}
+    Log    ${testrolename}
+    # Post this puppy
+    ${content}=    Post New Role    ${data}
+    # parse out the role-id from the content we just created
+    ${roleid}=    Parse Item From Blob By Offset    ${content}    0
+    Log    ${roleid}
+
+    # now got GET the roleid info and compare to the name we fabricated
+    # and parse out role name
+    ${existing_roleitem}=    Get Specific Role    ${roleid}
+    ${expected_rolename}=    Parse Item From Blob By Offset    ${content}    1
+    Log    ${expected_rolename}
+
+    # compare to see if the GOTTEN role id matches the one we grabbed from list
+    Should Be Equal    ${expected_rolename}    ${testrolename}
+
+Test Delete Role
+    [Documentation]    Exercise REST command for DELETE role command.
+    # create a role and then delete it.    Use Get to verify it's gone
+    # create information for a new role (for the test)
+    ${testrolename}=    Create Random Name    force-usurper
+    ${data}=    Set Variable    {"description":"sample test description", "name":"${testrolename}", "roleid":1}
+    Log    ${testrolename}
+    # Post this disposable role
+    ${content}=    Post New Role    ${data}
+    # parse out the role-id from the content we just created
+    ${roleid}=    Parse Item From Blob By Offset    ${content}    0
+    Log    ${roleid}
+
+    # now delete it...
+    ${content2}=    Delete Role    ${roleid}
+    # should fail...
+    ${content}=    Check Specific Id Does Not Exist    role    ${roleid}
+    Log    ${content}
+
+Test Grant Role To Domain And User
+    [Documentation]    Test the POST of a Role to Domain and User
+
+    # rely on the creation of a test role, user and domain in the Setup routine
+    # pop item off of end of the list, for use (does not alter list)
+    ${role_item}=    Get From List    ${cleanup_role_list}    -1
+    Log    ${role_item}
+    ${user_item}=    Get From List    ${cleanup_user_list}    -1
+    Log    ${user_item}
+    ${domain_item}=    Get From List    ${cleanup_domain_list}    -1
+    Log    ${domain_item}
+
+    # parse out the roleid from the role info we just grabbed
+    ${roleid}=    Parse Item From Blob By Offset    ${role_item}    0
+    Log    ${roleid}
+
+    # parse out the name from the same info
+    ${rolename}=    Parse Item From Blob By Offset   ${role_item}    1
+    Log    ${rolename}
+
+    # parse out the userid from the user info we just grabbed
+    ${userid}=    Parse Item From Blob By Offset    ${user_item}    0
+    Log    ${userid}
+
+    # parse out the name from the same info
+    ${username}=    Parse Item From Blob By Offset    ${user_item}    1
+    Log    ${username}
+
+    # parse out the domain-id from the domain info we just grabbed
+    ${domainid}=    Parse Item From Blob By Offset    ${domain_item}    0
+    Log    ${domainid}
+
+    # parse out the name from the same info
+    ${domainname}=    Parse Item From Blob By Offset    ${domain_item}    1
+    Log    ${domainname}
+
+    # generate the data payload that we wish to post
+    ${data}=    Set Variable    {"roleid":"${roleid}", "description":"fabricated test roleid"}
+    # post this monster
+    ${content}=    Post Role To Domain And User    ${data}    ${domainid}    ${userid}
+    # add new json string to the cleanup list for later cleanup
+    Append To List    ${cleanup_grant_list}    ${content}
+    Should Contain    ${content}    ${domainid}
+    Should Contain    ${content}    ${roleid}
+    Should Contain    ${content}    ${userid}
+
+
+*** Keywords ***
+IdMLight Suite Setup
+    Log    Suite Setup
+    # create a domain, role and user for testing.
+    ${HEADERS}=    Create Dictionary    Content-Type=application/json
+    Log    ${HEADERS}
+    Set Global Variable    ${HEADERS}
+    # create a name to use in each case
+    ${testdomain}=    Create Random Name    Alderaan
+    Log    ${testdomain}
+    ${testuser}=    Create Random Name    Leia
+    Log    ${testuser}
+    ${testrole}=    Create Random Name    Force-User
+    Log    ${testrole}
+    # now create the domain, role and userid
+
+    # create the test domain
+    Create Session    httpbin    ${URI}
+    ${domaindata}=    Set Variable    {"description":"planetary domain","domainid":"7","name":"${testdomain}","enabled":"true"}
+    ${newdomain}=    Post New Domain    ${testdomain}    ${domaindata}
+    Log    ${newdomain}
+    # add new domain name to the cleanup list for later cleanup
+    Append To List    ${cleanup_domain_list}    ${newdomain}
+    # now create the test user
+    ${userdata}=    Set Variable    {"description":"User-of-the-Force","name":"${testuser}","enabled":"true"}
+    ${newuser}=    Post New User    ${testuser}    ${userdata}
+    Log    ${newuser}
+    # add new user name to the cleanup list for later cleanup
+    Append To List    ${cleanup_user_list}    ${newuser}
+    # now create the test role
+    ${roledata}=    Set Variable    {"name":"${testrole}","description":"Force User"}
+    ${newrole}=    Post New Role    ${roledata}
+    # add new role name to the cleanup list for later cleanup
+    Append To List    ${cleanup_role_list}    ${newrole}
+    #
+    # return the three item names to the caller of setup
+    [Return]    ${newdomain}    ${newuser}    ${newrole}
+
+IdMLight Suite Teardown
+    Log    Suite Teardown
+    ${ELEMENT}=    Create Session    httpbin    ${URI}
+    # if the test domain, role or user exists, wipe it out.
+    : FOR    ${ELEMENT}    IN    @{cleanup_domain_list}
+    \    ${ELEMENT}    Replace String    ${ELEMENT}    ${SPACE}    ${EMPTY}
+    \    Log    ${ELEMENT}
+    \    # split it up to get the domainid
+    \    ${x}=    Split String    ${ELEMENT}    ,
+    \    ${y}=    Get From List    ${x}    0
+    \    ${z}=    Split String    ${y}    :
+    \    ${domainid}=    Get From List    ${z}    1
+    \    Log    ${domainid}
+    \    # convert name on the list to an ID, by which we delete this stuff
+    \    Delete Domain    ${domainid}
+    Log    ${cleanup_domain_list}
+    # Cleanup roles that were created during testing
+    : FOR    ${ELEMENT}    IN    @{cleanup_role_list}
+    \    Log    ${ELEMENT}
+    \    ${ELEMENT}    Replace String    ${ELEMENT}    ${SPACE}    ${EMPTY}
+    \    Log    ${ELEMENT}
+    \    # split it up to get the roleid
+    \    ${x}=    Split String    ${ELEMENT}    ,
+    \    ${y}=    Get From List    ${x}    0
+    \    ${z}=    Split String    ${y}    :
+    \    ${roleid}=    Get From List    ${z}    1
+    \    Log    ${roleid}
+    \    # convert name on the list to an ID, by which we delete this stuff
+    \    Delete Role    ${roleid}
+    Log    ${cleanup_role_list}
+    # Cleanup users that were created during testing
+    : FOR    ${ELEMENT}    IN    @{cleanup_user_list}
+    \    Log    ${ELEMENT}
+    \    ${ELEMENT}    Replace String    ${ELEMENT}    ${SPACE}    ${EMPTY}
+    \    Log    ${ELEMENT}
+    \    # split it up to get the roleid
+    \    ${x}=    Split String    ${ELEMENT}    ,
+    \    ${y}=    Get From List    ${x}    0
+    \    ${z}=    Split String    ${y}    :
+    \    ${userid}=    Get From List    ${z}    1
+    \    Log    ${userid}
+    \    Delete User    ${userid}
+    Log    ${cleanup_user_list}
+    
+    Delete All Sessions
+
+Check Specific Id Does Not Exist
+    [Arguments]    ${area_to_look}    ${id}
+    [Documentation]    Execute GET command on specified single id
+    # the ITEM is the area to look under...    users, domains, roles, etc
+    ${n1}=    Set Variable    auth/v1/${area_to_look}/${id}
+    # do the actual get
+    ${resp}    RequestsLibrary.Get    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    404
+    ${id_string}=    Convert To String    ${id}
+    Should Contain    ${resp.content}    ${id_string}
+    [Return]    ${resp.content}
+
+Get Specific Domain
+    [Arguments]    ${domainid}
+    [Documentation]    Execute GET command on specified single domain
+    ${n1}=    Set Variable    auth/v1/domains/${domainid}
+    ${resp}    RequestsLibrary.Get    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    ${domainid_string}=    Convert To String    ${domainid}
+    Should Contain    ${resp.content}    ${domainid_string}
+    [Return]    ${resp.content}
+
+Get Specific Domain Name
+    [Arguments]    ${domainid}
+    [Documentation]    Execute GET command on specified single domain
+    ${n1}=    Set Variable    auth/v1/domains/${domainid}
+    ${resp}    RequestsLibrary.Get    httpbin    ${n1}    headers=${HEADERS}
+    Should Contain    ${resp.content}    ${domainid}
+    Log    ${resp.content}
+    [Return]    ${resp.content}
+
+Get Specific Role
+    [Arguments]    ${roleid}
+    [Documentation]    Exercise REST command to GET a specific role, based on role-id
+    ${n1}=    Set Variable    auth/v1/roles/${roleid}
+    ${resp}    RequestsLibrary.Get    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    Should Contain    ${resp.content}    ${roleid}
+    [Return]    ${resp.content}
+
+Get Domains
+    [Documentation]    Execute getdomains GET command.
+    ${n1}=    Set Variable    auth/v1/domains
+    ${resp}    RequestsLibrary.Get    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    Should Contain    ${resp.content}    "domains"
+    [Return]    ${resp.content}
+
+Get Roles
+    [Documentation]    Execute GET command to obtain list of roles.
+    ${n1}=    Set Variable    auth/v1/roles
+    ${resp}    RequestsLibrary.Get    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    Should Contain    ${resp.content}    "roles"
+    [Return]    ${resp.content}
+
+Get Specific User
+    [Arguments]    ${user}
+    [Documentation]    Exercise REST command for users GET command.
+    ${n1}=    Set Variable    auth/v1/users/${user}
+    ${resp}    RequestsLibrary.Get    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    Should Contain    ${resp.content}    ${user}
+    [Return]    ${resp.content}
+
+Get Users
+    [Documentation]    GET the complete set of users.
+    ${n1}=    Set Variable    auth/v1/users
+    ${resp}    RequestsLibrary.Get    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    Should Contain    ${resp.content}    ${user}
+    [Return]    ${resp.content}
+
+Post New Domain
+    [Arguments]    ${domain}    ${data}
+    [Documentation]    Exercise REST command for domains POST command.
+    ${n1}=    Set Variable    auth/v1/domains
+    ${resp}    RequestsLibrary.Post    httpbin    ${n1}    headers=${HEADERS}    data=${data}
+    Should Be Equal As Strings    ${resp.status_code}    201
+    Should Contain    ${resp.content}    ${domain}
+    [Return]    ${resp.content}
+
+Post New Role
+    [Arguments]    ${data}
+    [Documentation]    Use POST REST command to create specified Role.
+    ${n1}=    Set Variable    auth/v1/roles
+    ${resp}    RequestsLibrary.Post    httpbin    ${n1}    headers=${HEADERS}    data=${data}
+    #    HTTP/1.1 201 Created
+    Should Be Equal As Strings    ${resp.status_code}    201
+    [Return]    ${resp.content}
+
+Post New User
+    [Arguments]    ${username}    ${data}
+    [Documentation]    Exercise REST command for users POST command.
+    ${n1}=    Set Variable    auth/v1/users
+    ${resp}    RequestsLibrary.Post    httpbin    ${n1}    headers=${HEADERS}    data=${data}
+    # grab the list of users, count the list, and then search the list for the specific user id
+    ${users}=    Get Users
+    ${depth}=    Nodecount    ${users}    users    userid
+    ${abc}=    Get User Id By Username    ${users}    ${username}    ${depth}
+    Should Be Equal As Strings    ${resp.status_code}    201
+    Should Contain    ${resp.content}    ${username}
+    [Return]    ${resp.content}
+
+Get User By Name
+    [Arguments]    ${jsonblock}    ${property}
+    [Documentation]    hand this function a block of Json, and it will find your
+    ...    user by name and return userid
+    ${foundit}=    Get From Dictionary    ${jsonblock}    ${property}
+
+Update Specific Domain
+    [Arguments]    ${data}    ${domainid}
+    [Documentation]    Update the specified domainid with a new name specified in domain-name
+    ${n1}=    Set Variable    auth/v1/domains/${domainid}
+    ${resp}    RequestsLibrary.Put    httpbin    ${n1}    headers=${HEADERS}    data=${data}
+    # Should Be Equal As Strings    ${resp.status_code}    201
+    Log    ${resp.content}
+
+Update Specific Role
+    [Arguments]    ${data}    ${roleid}
+    [Documentation]    Update the specified roleid with a new information name specified
+    ${n1}=    Set Variable    auth/v1/roles/${roleid}
+    ${resp}    RequestsLibrary.Put    httpbin    ${n1}    headers=${HEADERS}    data=${data}
+    # Should Be Equal As Strings    ${resp.status_code}    201
+    Log    ${resp.content}
+
+Update Specific User
+    [Arguments]    ${data}    ${userid}
+    [Documentation]    Update the specified userid with a new information name specified
+    ${n1}=    Set Variable    auth/v1/users/${userid}
+    ${resp}    RequestsLibrary.Put    httpbin    ${n1}    headers=${HEADERS}    data=${data}
+    # Should Be Equal As Strings    ${resp.status_code}    201
+    Log    ${resp.content}
+
+Delete Domain
+    [Arguments]    ${domainid}
+    [Documentation]    Delete the specified domain, by id
+    ${n1}=    Set Variable    auth/v1/domains/${domainid}
+    Log    ${n1}
+    ${resp}    RequestsLibrary.Delete    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    204
+    Log    ${resp.content}
+
+Delete User
+    [Arguments]    ${userid}
+    [Documentation]    Delete the specified user, by id
+    ${n1}=    Set Variable    auth/v1/users/${userid}
+    ${resp}    RequestsLibrary.Delete    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    204
+    Log    ${resp.content}
+
+Delete Role
+    [Arguments]    ${roleid}
+    [Documentation]    Use DELETE REST command to wipe out a Role created for testing.
+    ${n1}=    Set Variable    auth/v1/roles/${roleid}
+    ${resp}    RequestsLibrary.Delete    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    204
+    #Should NOT Contain    ${resp.content}    ${roleid}
+    [Return]    ${resp.content}
+
+Post Role To Domain And User
+    [Arguments]    ${data}    ${domainid}    ${userid}
+    [Documentation]    Exercise REST POST command for posting a role to particular domain and user
+    ${n1}=    Set Variable    auth/v1/domains/${domainid}/users/${userid}/roles
+    # now post it
+    ${resp}    RequestsLibrary.Post    httpbin    ${n1}    headers=${HEADERS}    data=${data}
+    Should Be Equal As Strings    ${resp.status_code}    201
+    [Return]    ${resp.content}
+
+Get Roles For Specific Domain And User
+    [Arguments]    ${domainid}    ${userid}
+    [Documentation]    Exercise REST GET command for roles in a specific domain and user
+    ${n1}=    Set Variable    auth/v1/domains/${domainid}/users/${userid}/roles
+    # now get it
+    ${resp}    RequestsLibrary.Get    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    [Return]    ${resp.content}
+
+Delete Specific Grant
+    [Arguments]    ${domainid}    ${userid}    ${roleid}
+    [Documentation]    Exercise REST DELETE command for a grant by roleid
+    ${n1}=    Set Variable    auth/v1/domains/${domainid}/users/${userid}/roles/${roleid}
+    # now delete it
+    ${resp}    RequestsLibrary.Delete    httpbin    ${n1}    headers=${HEADERS}
+    Should Be Equal As Strings    ${resp.status_code}    204
+    [Return]    ${resp.content}
+
+Parse Item From Blob By Offset
+    [Documentation]    Parse out a field from JSON structure
+    [Arguments]    ${item}    ${offset}
+    ${x}=    Split String    ${item}    ,
+    ${y}=    Get From List    ${x}    ${offset}
+    ${z}=    Split String    ${y}    :
+
+    # offset is one in next line because you are looking at a key:value pair
+    ${return_item_}=    Get From List    ${z}    1
+    ${return_item}=    Replace String    ${return_item_}    "    ${EMPTY}
+    [Return]    ${return_item}
+
+Create Random Name
+    [Arguments]    ${basename}
+    [Documentation]    Take the basename given and return a new name with date-time-stamp appended.
+    ${datetime}=    Get Current Date    result_format=%Y-%m-%d-%H-%M
+    Log    ${datetime}
+    ${newname}=    Catenate    SEPARATOR=-    ${basename}    ${datetime}
+    [Return]    ${newname}
+
+Pop Name Off Json
+    [Arguments]    ${jsonstring}
+    [Documentation]    Pop the name item out of the Json string
+    # split it up to get the id
+    ${x}=    Split String    ${jsonstring}    ,
+    ${y}=    Get From List    ${x}    1
+    ${z}=    Split String    ${y}    :
+    ${name}=    Get From List    ${z}    1
+    ${name}=    Replace String    ${name}    "    ${EMPTY}
+    Log    ${name}
+    [Return]    ${name}
+
+Verify Contents
+    [Arguments]    ${content_block}    ${keyvar}
+    [Documentation]    Verify that the content block passed in, contains the variable identified in second argument
+    Should Contain    ${content_block}    ${keyvar}
+
+Rough Clean
+    [Documentation]    Clean up domains, users, roles in db, keep original 4 of each
+    ${domains}=    Get Domains
+    ${roles}=    Get Roles
+    ${users}=    Get Users
+    ${domcount}=    Nodecount    ${domains}    domains    "domainid"
+    ${rolecount}=    Nodecount    ${roles}    roles    "roleid"
+    ${usercount}=    Nodecount    ${users}    users    "userid"
+    : FOR    ${index}    IN RANGE    5    ${domains}
+    \    Delete Domain    ${index}
+    : FOR    ${index}    IN RANGE    5    ${roles}
+    \    Delete Role    ${index}
+    : FOR    ${index}    IN RANGE    5    ${users}
+    \    Delete User    ${index}