module openstack {
  prefix os;

  import nfv-infrastructure { prefix nfvi; }
  import access-control-models { prefix acm; }
  import ietf-yang-types { prefix yang; }
  import ietf-inet-types { prefix inet; }
  import complex-types { prefix ct; }

  description
    "OpenStack controller module";

  revision 2016-01-19 {
    description "Basic coverage of limited intents needed for Promise";
  }
  
  identity openstack { base nfvi:manager; }
  identity release { base openstack; }
  identity distro { base openstack; }

  feature os-system-admin {
    description "OpenStack system administration capability";
  }
  
  grouping os-credentials {
    uses acm:access-credentials {
      refine strategy {
        default keystone;
      }
      refine endpoint {
        default "http://localhost:5000/v2.0";
      }
    }
    container tenant {
      leaf id { type string; }
      leaf name { type string; }
    }
  }
  
  // OpenStack infrastructure platform (PLACEHOLDER)
  container platform {
    uses nfvi:resource-stack;
    
    leaf release { type identityref { base release; } }
    leaf distro  { type identityref { base distro; } }
    
    //ct:instance-list services { ct:instance-type OpenStackService; }
    //ct:instance-list endpoints { ct:instance-type ServiceEndpoint; }
  }

  // OpenStack system administrator configuration tree
  container admin {
    if-feature os-system-admin;
    container auth {
      uses os-credentials;
      leaf token { type yang:uuid; }
    }
  }

  rpc authenticate {
    if-feature os-system-admin;
    input {
      uses os-credentials;
    }
    output {
      leaf token { type yang:uuid; }
    }
  }

  rpc create-tenant {
    if-feature os-system-admin;
    
  }
}