.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. Copyright © 2017 AT&T Intellectual Property. All rights reserved.


Development
============
.. _Example RESTful Client: https://gerrit.onap.org/r/gitweb?p=aaf/authz.git;a=blob;f=cadi/oauth-enduser/src/main/java/org/onap/aaf/cadi/enduser/SimpleRESTClient.java;h=30344de521ae628221bdb54642a71733304a5656;hb=HEAD
.. _Developer Video: https://wiki.onap.org/download/attachments/38111886/ONAPClient.mp4?version=1&modificationDate=1532378616000&api=v2

============
Resources
============
  * `Example RESTful Client`_ (Java Client)
  * `Developer Video`_ (might be large)

=========================
ONAP Test Env
=========================

-------
Purpose
-------

The AAF Test Environment is a single instance VM setp so that 
  - ONAP Developers can utilize AAF with their personal machines without having to run their own AAF. 
  - ONAP Developers can put the Permissions and Roles required for their Apps into a common AAF Environment with others
  - AAF will pull (on demand) all the ONAP related Data (Perms/Roles/Identities) and put into "Bootstrap Data".  
	- This Bootstrap data becomes available on the myriad Testing Systems so that
		- They don't have to create AAF Data loading on their own.
		- The data is already consistent with other ONAP entities.

------
Access
------

You must be connected to the WindRiver "pod-onap-01" VPN to gain access
to AAF Beijing

----------------
DNS (/etc/hosts)
----------------

At this time, there is no known DNS available for ONAP Entities.  It is
recommended that you add the following entry into your "/etc/hosts" on
your accessing machine:

    /etc/hosts:

    10.12.6.214 aaf-onap-beijing-test aaf-onap-beijing-test.osaaf.org

------------------------------
Environment Artifacts (AAF FS)
------------------------------

    AAF has an HTTP Fileserver to gain access to needed public info.

    http://aaf-onap-beijing-test.osaaf.org/-

-----------
Credentials
-----------

    AAF does support User/Password, and allows additional plugins as it
    did in Amsterdam, however, User/Password credentials are inferior to
    PKI technology, and does not match the ONAP Design goal of TLS and
    PKI Identity across the board.  Therefore, while an individual
    organization might avail themselves of the User/Password facilities
    within AAF, for ONAP, we are avoiding.

    THEREFORE: **GO WITH CERTIFICATE IDENTITY**


Root Certificate
^^^^^^^^^^^^^^^^

    `AAF\_RootCA.cer <http://aaf-onap-beijing-test.osaaf.org/AAF_RootCA.cer>`__

AAF CA
^^^^^^

    At time of Beijing, an official Certificate Authority for ONAP was
    not declared, installed or operationalized.  Secure TLS requires
    certificates, so for the time being, the Certificate Authority is
    being run by AAF Team.

Root Certificate
''''''''''''''''

    | The Root Certificate for ONAP Certificate Authority used by AAF
      is \ `AAF\_RootCA.cer <http://aaf-onap-beijing-test.osaaf.org/AAF_RootCA.cer>`__
    | Depending on your Browser/ Operating System, clicking on this link
      will allow you to install this Cert into your Browser for GUI
      access (see next)

    This Root Certificate is also available in "truststore" form, ready
    to be used by Java or other processes:

-  

   -  

      -  `truststoreONAP.p12 <http://aaf-onap-beijing-test.osaaf.org/truststoreONAP.p12>`__ 
             -  This Truststore has ONLY the ONAP AAF\_RootCA in it.

      -  `truststoreONAPall.jks <http://aaf-onap-beijing-test.osaaf.org/truststoreONAPall.jks>`__
             - This Truststore has the ONAP AAF\_RootCA in it PLUS all the Public CA Certs that are in Java 1.8.131 (note: this is in jks format, because the original JAVA truststore was in jks format)

    Note: as of Java 8, pkcs12 format is recommended, rather than jks.
     Java's "keytool" utility provides a conversion for .jks for Java 7
    and previous.

Identity
''''''''

    Certificates certify nothing if there is no identity or process to
    verify the Identity.  Typically, for a company, an HR department
    will establish the formal organization, specifically, who reports to
    whom.  For ONAP, at time of Beijing, no such formalized "Org Chart"
    existed, so we'll be building this up as we go along.

    Therefore, with each Certificate Request, we'll need identity
    information as well, that will be entered into an ONAP Identity
    file.  Again, as a real company, this can be derived or accessed
    real-time (if available) as an "Organization Plugin".  Again, as
    there appears to be no such central formal system in ONAP, though,
    of course, Linux Foundation logins have some of this information for
    ALL LF projects.  Until ONAP declares such a system or decides how
    we might integrate with LF for Identity and we have time to create
    an Integration strategy, AAF will control this data.

    For each Identity, we'll need:

  People
        

    | # 0 - unique ID (for Apps, just make sure it is unique, for
      People, one might consider your LinuxFoundation ID)
    | # 1 - full name (for App, name of the APP)
    | # 2 - first name (for App, 
    | # 3 - last name
    | # 4 - phone
    | # 5 - official email
    | # 6 - type - person
    | # 7 - reports to: If you are working as part of a Project, list
      the PTL of your Project.  If you are PTL, just declare you are the
      PTL 

  Applications
              

    | # 0 - unique ID - For ONAP Test, this will be the same a the App
      Acronym.
    | # 1 - full name of the App
    | # 2 - App Acronym
    | # 3 - App Description, or just "Application"
    | # 5 - official email - a Distribution list for the Application, or
      the Email of the Owner
    | # 6 - type - application
    | # 7 - reports to: give the Application Owner's Unique ID.  Note,
      this should also be the Owner in AAF Namespace

Obtaining a Certificate
'''''''''''''''''''''''

Services/Clients
    See `Automated Configuration and Certificates`_.

.. _Automated Configuration and Certificates: AAF_4.1_config.html

People
      

    People Certificates can be used for browsers, curl, etc.

    Automation and tracking of People Certificates will be proposed for
    Dublin.



