module openstack-compute {
  prefix os-com;

  import nfv-infrastructure { prefix nfvi; }
  import complex-types { prefix ct; }

  identity nova { base nvfi:compute; }
  
  feature availability-zone {
    description "Specifies whether availability zone functionality is available.";
  }
  feature extended-status {
    description "Specifies whether extended status functionality is available.";
  }
  feature security-groups {
    description "Specifies whether security groups functionality is available.";
  }

  ct:complex-type ServerInstance {
    ct:extends nfvi:ServerInstance;

    leaf zone {
      if-feature availability-zone;
      type string;
    }

    leaf project {
      type instance-identifier { ct:instance-type nfvi:ResourceProject; }
      mandatory true;
    }

    container extended-status {
      if-feature extended-status;
      leaf locked-by;
      leaf power;
      leaf task;
      leaf vm;
    }

    leaf-list security-groups {
      if-feature security-groups;
      type instance-identifier { ct:instance-type SecurityGroup; }
    }

  }

  choice version {
    case v2.1 {
      ct:instance-list servers { ct:instance-type ServerInstance; }
    }
  }

  // OpenStack Nova specific RPC calls
  rpc resize {
    input {
      leaf server { type instance-type { ct:instance-type ServerInstance; } }
      // other params for resize
    }
  }
  rpc backup;
  rpc migrate;
  rpc restore;
  rpc evacuate;
  rpc lock;
  rpc unlock;
  rpc suspend;
  rpc resume;
  rpc pause;
  rpc unpause;
  rpc inject-network;
  rpc reset-network;
}