swagger: '2.0'
info:
  title: Harbor API
  description: These APIs provide services for manipulating Harbor project.
  version: 1.4.0
host: localhost
schemes:
  - http
basePath: /api
produces:
  - application/json
  - text/plain
consumes:
  - application/json
paths:
  /search:
    get:
      summary: Search for projects and repositories
      description: >
        The Search endpoint returns information about the projects and
        repositories

        offered at public status or related to the current logged in user. The

        response includes the project and repository list in a proper

        display order.
      parameters:
        - name: q
          in: query
          description: Search parameter for project and repository name.
          required: true
          type: string
      tags:
        - Products
      responses:
        '200':
          description: An array of search results
          schema:
            type: array
            items:
              $ref: '#/definitions/Search'
        '500':
          description: Unexpected internal errors.
  /projects:
    get:
      summary: List projects
      description: >
        This endpoint returns all projects created by Harbor, and can be
        filtered by project name.
      parameters:
        - name: name
          in: query
          description: The name of project.
          required: false
          type: string
        - name: public
          in: query
          description: The project is public or private.
          required: false
          type: boolean
          format: int32
        - name: owner
          in: query
          description: The name of project owner.
          required: false
          type: string
        - name: page
          in: query
          type: integer
          format: int32
          required: false
          description: 'The page nubmer, default is 1.'
        - name: page_size
          in: query
          type: integer
          format: int32
          required: false
          description: 'The size of per page, default is 10, maximum is 100.'
      tags:
        - Products
      responses:
        '200':
          description: Return all matched projects.
          schema:
            type: array
            items:
              $ref: '#/definitions/Project'
          headers:
            X-Total-Count:
              description: The total count of projects
              type: integer
            Link:
              description: Link refers to the previous page and next page
              type: string
        '401':
          description: User need to log in first.
        '500':
          description: Internal errors.
    head:
      summary: Check if the project name user provided already exists.
      description: >
        This endpoint is used to check if the project name user provided already
        exist.
      parameters:
        - name: project_name
          in: query
          description: Project name for checking exists.
          required: true
          type: string
      tags:
        - Products
      responses:
        '200':
          description: Project name exists.
        '401':
          description: User need to log in first.
        '404':
          description: Project name does not exist.
        '500':
          description: Unexpected internal errors.
    post:
      summary: Create a new project.
      description: |
        This endpoint is for user to create a new project.
      parameters:
        - name: project
          in: body
          description: New created project.
          required: true
          schema:
            $ref: '#/definitions/ProjectReq'
      tags:
        - Products
      responses:
        '201':
          description: Project created successfully.
        '400':
          description: Unsatisfied with constraints of the project creation.
        '401':
          description: User need to log in first.
        '409':
          description: Project name already exists.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  '/projects/{project_id}':
    get:
      summary: Return specific project detail infomation
      description: |
        This endpoint returns specific project information by project ID.
      parameters:
        - name: project_id
          in: path
          description: Project ID for filtering results.
          required: true
          type: integer
          format: int64
      tags:
        - Products
      responses:
        '200':
          description: Return matched project information.
          schema:
            $ref: '#/definitions/Project'
        '401':
          description: User need to log in first.
        '500':
          description: Internal errors.
    put:
      summary: Update properties for a selected project.
      description: |
        This endpoint is aimed to update the properties of a project.
      parameters:
        - name: project_id
          in: path
          type: integer
          format: int64
          required: true
          description: Selected project ID.
        - name: project
          in: body
          required: true
          schema:
            $ref: '#/definitions/ProjectReq'
          description: Updates of project.
      tags:
        - Products
      responses:
        '200':
          description: Updated project properties successfully.
        '400':
          description: Illegal format of provided ID value.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission to the project.
        '404':
          description: Project ID does not exist.
        '500':
          description: Unexpected internal errors.
    delete:
      summary: Delete project by projectID
      description: |
        This endpoint is aimed to delete project by project ID.
      parameters:
        - name: project_id
          in: path
          description: Project ID of project which will be deleted.
          required: true
          type: integer
          format: int64
      tags:
        - Products
      responses:
        '200':
          description: Project is deleted successfully.
        '400':
          description: Invalid project id.
        '403':
          description: User need to log in first.
        '404':
          description: Project does not exist.
        '412':
          description: 'Project contains policies, can not be deleted.'
        '500':
          description: Internal errors.
  '/projects/{project_id}/logs':
    get:
      summary: Get access logs accompany with a relevant project.
      description: >
        This endpoint let user search access logs filtered by operations and
        date time ranges.
      parameters:
        - name: project_id
          in: path
          type: integer
          format: int64
          required: true
          description: Relevant project ID
        - name: username
          in: query
          type: string
          required: false
          description: Username of the operator.
        - name: repository
          in: query
          type: string
          required: false
          description: The name of repository
        - name: tag
          in: query
          type: string
          required: false
          description: The name of tag
        - name: operation
          in: query
          type: string
          required: false
          description: The operation
        - name: begin_timestamp
          in: query
          type: string
          required: false
          description: The begin timestamp
        - name: end_timestamp
          in: query
          type: string
          required: false
          description: The end timestamp
        - name: page
          in: query
          type: integer
          format: int32
          required: false
          description: 'The page nubmer, default is 1.'
        - name: page_size
          in: query
          type: integer
          format: int32
          required: false
          description: 'The size of per page, default is 10, maximum is 100.'
      tags:
        - Products
      responses:
        '200':
          description: Get access log successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/AccessLog'
          headers:
            X-Total-Count:
              description: The total count of access logs
              type: integer
            Link:
              description: Link refers to the previous page and next page
              type: string
        '400':
          description: Illegal format of provided ID value.
        '401':
          description: User need to log in first.
        '500':
          description: Unexpected internal errors.
  '/projects/{project_id}/metadatas':
    get:
      summary: Get project metadata.
      description: |
        This endpoint returns metadata of the project specified by project ID.
      parameters:
        - name: project_id
          in: path
          description: The ID of project.
          required: true
          type: integer
          format: int64
      tags:
        - Products
      responses:
        '200':
          description: Get metadata successfully.
          schema:
            $ref: '#/definitions/ProjectMetadata'
        '401':
          description: User need to login first.
        '500':
          description: Internal server errors.
    post:
      summary: Add metadata for the project.
      description: |
        This endpoint is aimed to add metadata of a project.
      parameters:
        - name: project_id
          in: path
          type: integer
          format: int64
          required: true
          description: Selected project ID.
        - name: metadata
          in: body
          required: true
          schema:
            $ref: '#/definitions/ProjectMetadata'
          description: The metadata of project.
      tags:
        - Products
      responses:
        '200':
          description: Add metadata successfully.
        '400':
          description: Invalid request.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission to the project.
        '404':
          description: Project ID does not exist.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Internal server errors.
  '/projects/{project_id}/metadatas/{meta_name}':
    get:
      summary: Get project metadata
      description: |
        This endpoint returns specified metadata of a project.
      parameters:
        - name: project_id
          in: path
          description: Project ID for filtering results.
          required: true
          type: integer
          format: int64
        - name: meta_name
          in: path
          description: The name of metadat.
          required: true
          type: string
      tags:
        - Products
      responses:
        '200':
          description: Get metadata successfully.
          schema:
            $ref: '#/definitions/ProjectMetadata'
        '401':
          description: User need to log in first.
        '500':
          description: Internal server errors.
    put:
      summary: Update metadata of a project.
      description: |
        This endpoint is aimed to update the metadata of a project.
      parameters:
        - name: project_id
          in: path
          type: integer
          format: int64
          required: true
          description: The ID of project.
        - name: meta_name
          in: path
          description: The name of metadat.
          required: true
          type: string
      tags:
        - Products
      responses:
        '200':
          description: Updated metadata successfully.
        '400':
          description: Invalid request.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission to the project.
        '404':
          description: Project or metadata does not exist.
        '500':
          description: Internal server errors.
    delete:
      summary: Delete metadata of a project
      description: |
        This endpoint is aimed to delete metadata of a project.
      parameters:
        - name: project_id
          in: path
          description: The ID of project.
          required: true
          type: integer
          format: int64
        - name: meta_name
          in: path
          description: The name of metadat.
          required: true
          type: string
      tags:
        - Products
      responses:
        '200':
          description: Metadata is deleted successfully.
        '400':
          description: Invalid requst.
        '403':
          description: User need to log in first.
        '404':
          description: Project or metadata does not exist.
        '500':
          description: Internal server errors.
  '/projects/{project_id}/members':
    get:
     summary: Get all project member information
     description: Get all project member information
     parameters:
      - name: project_id
        in: path
        type: integer
        format: int64
        required: true
        description: Relevant project ID.
      - name: entityname
        in: query
        type: string
        description: The entity name to search.
     tags:
      - Products
     responses:
      '200':
        description: Get project members successfully.
        schema:
          type: array
          items: 
            $ref: '#/definitions/ProjectMemberEntity'
      '400':
        description: The project id is invalid.
      '401':
        description: User need to log in first.
      '403':
        description: User in session does not have permission to the project.
      '404':
        description: Project ID does not exist.
      '500':
        description: Unexpected internal errors.
    post:
      summary: Create project member
      description: >-
        Create project member relationship, the member can be one of the user_member and group_member, 
        The user_member need to specify user_id or username. If the user already exist in harbor DB, specify the user_id, 
        If does not exist in harbor DB, it will SearchAndOnBoard the user.
        The group_member need to specify id or ldap_group_dn. If the group already exist in harbor DB. specify the user group's id, 
        If does not exist, it will SearchAndOnBoard the group. 
      tags:
       - Products
      parameters:
        - name: project_id
          in: path
          type: integer
          format: int64
          required: true
          description: Relevant project ID.
        - name: project_member
          in: body
          schema:
            $ref: '#/definitions/ProjectMember'
      responses:
        '201':
          description: Project member created successfully.
        '400':
          description: Illegal format of project member or project id is invalid.
        '401':
          description: User need to log in first.
        '403':
          description: User in session does not have permission to the project.
        '404':
          description: Project does not exist, or the username does not found, or the user group does not found.
        '500':
          description: Unexpected internal errors.  
  '/projects/{project_id}/members/{mid}':
    get:
     summary: Get the project member information
     description: Get the project member information
     tags:
      - Products
     parameters:
      - name: project_id
        in: path
        type: integer
        format: int64
        required: true
        description: Relevant project ID.
      - name: mid
        in: path
        type: integer
        format: int64
        required: true
        description: The member ID
     responses:
        '200':
          description: Project member retrieved successfully.
          schema:
            $ref: '#/definitions/ProjectMemberEntity'
        '400':
          description: Illegal format of project member or invalid project id, member id.
        '401':
          description: User need to log in first.
        '403':
          description: User in session does not have permission to the project.
        '404':
          description: Project or projet member does not exist.
        '500':
          description: Unexpected internal errors.  
    put:
     summary: Update project member
     description: Update project member relationship
     tags:
        - Products
     parameters:
      - name: project_id
        in: path
        type: integer
        format: int64
        required: true
        description: Relevant project ID.
      - name: mid
        in: path
        type: integer
        format: int64
        required: true
        description: Member ID.  
      - name: role
        in: body
        schema:
          $ref: '#/definitions/RoleRequest'
     responses:
      '200':
        description: Project member updated successfully.
      '400':
        description: Invalid role id, it should be 1,2 or 3, or invalid project id, or invalid member id.
      '401':
        description: User need to log in first.
      '403':
        description: User in session does not have permission to the project.
      '404':
        description: project or project member does not exist.
      '500':
        description: Unexpected internal errors.           
    delete:
     summary: Delete project member
     tags:
      - Products
     parameters:
      - name: project_id
        in: path
        type: integer
        format: int64
        required: true
        description: Relevant project ID.
      - name: mid
        in: path
        type: integer
        format: int64
        required: true
        description: Member ID.  
     responses:
      '200':
        description: Project member deleted successfully.
      '400':
        description: The project id or project member id is invalid.
      '401':
        description: User need to log in first.
      '403':
        description: User in session does not have permission to the project.
      '500':
        description: Unexpected internal errors.  
  /statistics:
    get:
      summary: Get projects number and repositories number relevant to the user
      description: >
        This endpoint is aimed to statistic all of the projects number and
        repositories number relevant to the logined user, also the public
        projects number and repositories number. If the user is admin, he can
        also get total projects number and total repositories number.
      tags:
        - Products
      responses:
        '200':
          description: >-
            Get the projects number and repositories number relevant to the user
            successfully.
          schema:
            $ref: '#/definitions/StatisticMap'
        '401':
          description: User need to log in first.
        '500':
          description: Unexpected internal errors.
  /users:
    get:
      summary: Get registered users of Harbor.
      description: >
        This endpoint is for user to search registered users, support for
        filtering results with username.Notice, by now this operation is only
        for administrator.
      parameters:
        - name: username
          in: query
          type: string
          required: false
          description: Username for filtering results.
        - name: email
          in: query
          type: string
          required: false
          description: Email for filtering results.
        - name: page
          in: query
          type: integer
          format: int32
          required: false
          description: 'The page nubmer, default is 1.'
        - name: page_size
          in: query
          type: integer
          format: int32
          required: false
          description: The size of per page.
      tags:
        - Products
      responses:
        '200':
          description: Searched for users of Harbor successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/User'
        '400':
          description: Invalid user ID.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '500':
          description: Unexpected internal errors.
    post:
      summary: Creates a new user account.
      description: |
        This endpoint is to create a user if the user does not already exist.
      parameters:
        - name: user
          in: body
          description: New created user.
          required: true
          schema:
            $ref: '#/definitions/User'
      tags:
        - Products
      responses:
        '201':
          description: User created successfully.
        '400':
          description: Unsatisfied with constraints of the user creation.
        '403':
          description: >-
            User registration can only be used by admin role user when
            self-registration is off.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  /users/current:
    get:
      summary: Get current user info.
      description: |
        This endpoint is to get the current user infomation.
      tags:
        - Products
      responses:
        '200':
          description: Get current user information successfully.
          schema:
            $ref: '#/definitions/User'
        '401':
          description: User need to log in first.
  '/users/{user_id}':
    get:
      summary: Get a user's profile.
      description: |
        Get user's profile with user id.
      parameters:
        - name: user_id
          in: path
          type: integer
          format: int
          required: true
          description: Registered user ID
      tags:
        - Products
      responses:
        '200':
          description: Get user's profile successfully.
        '400':
          description: Invalid user ID.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '404':
          description: User ID does not exist.
        '500':
          description: Unexpected internal errors.
    put:
      summary: Update a registered user to change his profile.
      description: |
        This endpoint let a registered user change his profile.
      parameters:
        - name: user_id
          in: path
          type: integer
          format: int
          required: true
          description: Registered user ID
        - name: profile
          in: body
          description: 'Only email, realname and comment can be modified.'
          required: true
          schema:
            $ref: '#/definitions/UserProfile'
      tags:
        - Products
      responses:
        '200':
          description: Updated user's profile successfully.
        '400':
          description: Invalid user ID.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '404':
          description: User ID does not exist.
        '500':
          description: Unexpected internal errors.
    delete:
      summary: Mark a registered user as be removed.
      description: |
        This endpoint let administrator of Harbor mark a registered user as
        be removed.It actually won't be deleted from DB.
      parameters:
        - name: user_id
          in: path
          type: integer
          format: int
          required: true
          description: User ID for marking as to be removed.
      tags:
        - Products
      responses:
        '200':
          description: Marked user as be removed successfully.
        '400':
          description: Invalid user ID.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '404':
          description: User ID does not exist.
        '500':
          description: Unexpected internal errors.
  '/users/{user_id}/password':
    put:
      summary: Change the password on a user that already exists.
      description: >
        This endpoint is for user to update password. Users with the admin role
        can change any user's password. Guest users can change only their own
        password.
      parameters:
        - name: user_id
          in: path
          type: integer
          format: int
          required: true
          description: Registered user ID.
        - name: password
          in: body
          description: Password to be updated.
          required: true
          schema:
            $ref: '#/definitions/Password'
      tags:
        - Products
      responses:
        '200':
          description: Updated password successfully.
        '400':
          description: Invalid user ID; Old password is blank; New password is blank.
        '401':
          description: Don't have authority to change password. Please check login status.
        '403':
          description: Old password is not correct.
        '500':
          description: Unexpected internal errors.
  '/users/{user_id}/sysadmin':
    put:
      summary: Update a registered user to change to be an administrator of Harbor.
      description: |
        This endpoint let a registered user change to be an administrator
        of Harbor.
      parameters:
        - name: user_id
          in: path
          type: integer
          format: int
          required: true
          description: Registered user ID
        - name: has_admin_role
          in: body
          description: Toggle a user to admin or not.
          required: true
          schema:
            $ref: '#/definitions/HasAdminRole'
      tags:
        - Products
      responses:
        '200':
          description: Updated user's admin role successfully.
        '400':
          description: Invalid user ID.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '404':
          description: User ID does not exist.
        '500':
          description: Unexpected internal errors.
  /repositories:
    get:
      summary: Get repositories accompany with relevant project and repo name.
      description: >
        This endpoint let user search repositories accompanying with relevant
        project ID and repo name.
      parameters:
        - name: project_id
          in: query
          type: integer
          format: int32
          required: true
          description: Relevant project ID.
        - name: q
          in: query
          type: string
          required: false
          description: Repo name for filtering results.
        - name: label_id
          in: query
          type: integer
          required: false
          description: The ID of label used to filter the result.
        - name: page
          in: query
          type: integer
          format: int32
          required: false
          description: 'The page nubmer, default is 1.'
        - name: page_size
          in: query
          type: integer
          format: int32
          required: false
          description: 'The size of per page, default is 10, maximum is 100.'
      tags:
        - Products
      responses:
        '200':
          description: Get repositories successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/Repository'
          headers:
            X-Total-Count:
              description: The total count of repositories
              type: integer
            Link:
              description: Link refers to the previous page and next page
              type: string
        '400':
          description: Invalid project ID.
        '403':
          description: >-
            Project is not public or current user is irrelevant to the
            repository.
        '404':
          description: Project ID does not exist.
        '500':
          description: Unexpected internal errors.
  '/repositories/{repo_name}':
    delete:
      summary: Delete a repository.
      description: |
        This endpoint let user delete a repository with name.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: The name of repository which will be deleted.
      tags:
        - Products
      responses:
        '200':
          description: Delete successfully.
        '400':
          description: Invalid repo_name.
        '401':
          description: Unauthorized.
        '403':
          description: Forbidden.
        '404':
          description: Repository not found.
    put:
      summary: Update description of the repository.
      description: |
        This endpoint is used to update description of the repository.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: The name of repository which will be deleted.
        - name: description
          in: body
          description: The description of the repository.
          required: true
          schema:
            $ref: '#/definitions/RepositoryDescription'
      tags:
        - Products
      responses:
        '200':
          description: Update successfully.
        '401':
          description: Unauthorized.
        '403':
          description: Forbidden.
        '404':
          description: Repository not found.
  '/repositories/{repo_name}/labels':
    get:
      summary: Get labels of a repository.
      description: |
        Get labels of a repository specified by the repo_name.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: The name of repository.
      tags:
        - Products
      responses:
        '200':
          description: Successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/Label'
        '401':
          description: Unauthorized.
        '403':
          description: Forbidden. User should have read permisson for the repository to perform the action.
        '404':
          description: Repository not found.
    post:
      summary: Add a label to the repository.
      description: |
        Add a label to the repository.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: The name of repository.
        - name: label
          in: body
          description: Only the ID property is required.
          required: true
          schema:
            $ref: '#/definitions/Label'
      tags:
        - Products
      responses:
        '200':
          description: Successfully.
        '401':
          description: Unauthorized.
        '403':
          description: Forbidden. User should have write permisson for the repository to perform the action.
        '404':
          description: Resource not found.
  '/repositories/{repo_name}/labels/{label_id}':
    delete:
      summary: Delete label from the repository.
      description: |
        Delete the label from the repository specified by the repo_name.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: The name of repository.
        - name: label_id
          in: path
          type: integer
          required: true
          description: The ID of label.
      tags:
        - Products
      responses:
        '200':
          description: Successfully.
        '401':
          description: Unauthorized.
        '403':
          description: Forbidden. User should have write permisson for the repository to perform the action.
        '404':
          description: Resource not found.
  '/repositories/{repo_name}/tags/{tag}':
    get:
      summary: Get the tag of the repository.
      description: >
        This endpoint aims to retrieve the tag of the repository. If deployed
        with Notary, the signature property of response represents whether the
        image is singed or not. If the property is null, the image is unsigned.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: Relevant repository name.
        - name: tag
          in: path
          type: string
          required: true
          description: Tag of the repository.
      tags:
        - Products
      responses:
        '200':
          description: Get tag successfully.
          schema:
            $ref: '#/definitions/DetailedTag'
        '500':
          description: Unexpected internal errors.
    delete:
      summary: Delete a tag in a repository.
      description: |
        This endpoint let user delete tags with repo name and tag.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: The name of repository which will be deleted.
        - name: tag
          in: path
          type: string
          required: true
          description: Tag of a repository.
      tags:
        - Products
      responses:
        '200':
          description: Delete tag successfully.
        '400':
          description: Invalid repo_name.
        '401':
          description: Unauthorized.
        '403':
          description: Forbidden.
        '404':
          description: Repository or tag not found.
  '/repositories/{repo_name}/tags':
    get:
      summary: Get tags of a relevant repository.
      description: >
        This endpoint aims to retrieve tags from a relevant repository. If
        deployed with Notary, the signature property of response represents
        whether the image is singed or not. If the property is null, the image
        is unsigned.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: Relevant repository name.
        - name: label_ids
          in: query
          type: string
          required: false
          description: A list of comma separated label IDs.
      tags:
        - Products
      responses:
        '200':
          description: Get tags successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/DetailedTag'
        '500':
          description: Unexpected internal errors.
  '/repositories/{repo_name}/tags/{tag}/labels':
    get:
      summary: Get labels of an image.
      description: |
        Get labels of an image specified by the repo_name and tag.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: The name of repository.
        - name: tag
          in: path
          type: string
          required: true
          description: The tag of the image.
      tags:
        - Products
      responses:
        '200':
          description: Successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/Label'
        '401':
          description: Unauthorized.
        '403':
          description: Forbidden. User should have read permisson for the image to perform the action.
        '404':
          description: Resource not found.
    post:
      summary: Add a label to image.
      description: |
        Add a label to the image.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: The name of repository.
        - name: tag
          in: path
          type: string
          required: true
          description: The tag of the image.
        - name: label
          in: body
          description: Only the ID property is required.
          required: true
          schema:
            $ref: '#/definitions/Label'
      tags:
        - Products
      responses:
        '200':
          description: Successfully.
        '401':
          description: Unauthorized.
        '403':
          description: Forbidden. User should have write permisson for the image to perform the action.
        '404':
          description: Resource not found.
  '/repositories/{repo_name}/tags/{tag}/labels/{label_id}':
    delete:
      summary: Delete label from the image.
      description: |
        Delete the label from the image specified by the repo_name and tag.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: The name of repository.
        - name: tag
          in: path
          type: string
          required: true
          description: The tag of the image.
        - name: label_id
          in: path
          type: integer
          required: true
          description: The ID of label.
      tags:
        - Products
      responses:
        '200':
          description: Successfully.
        '401':
          description: Unauthorized.
        '403':
          description: Forbidden. User should have write permisson for the image to perform the action.
        '404':
          description: Resource not found.
  '/repositories/{repo_name}/tags/{tag}/manifest':
    get:
      summary: Get manifests of a relevant repository.
      description: |
        This endpoint aims to retreive manifests from a relevant repository.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: Repository name
        - name: tag
          in: path
          type: string
          required: true
          description: Tag name
        - name: version
          in: query
          type: string
          required: false
          description: >-
            The version of manifest, valid value are "v1" and "v2", default is
            "v2"
      tags:
        - Products
      responses:
        '200':
          description: Retrieved manifests from a relevant repository successfully.
          schema:
            $ref: '#/definitions/Manifest'
        '404':
          description: Retrieved manifests from a relevant repository not found.
        '500':
          description: Unexpected internal errors.
  '/repositories/{repo_name}/tags/{tag}/scan':
    post:
      summary: Scan the image.
      description: >
        Trigger jobservice to call Clair API to scan the image identified by the
        repo_name and tag.  Only project admins have permission to scan images
        under the project.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: Repository name
        - name: tag
          in: path
          type: string
          required: true
          description: Tag name
      tags:
        - Products
      responses:
        '200':
          description: Successfully created the job to scan image.
        '401':
          description: User needs to login or call the API with correct credentials.
        '403':
          description: User doesn't have permission to perform the action.
        '404':
          description: The image does not exist in Harbor.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '503':
          description: Harbor is not deployed with Clair.
  /repositories/scanAll:
    post:
      summary: Scan all images of the registry.
      description: >
        The server will launch different jobs to scan each image on the
        regsitry, so this is equivalent to calling  the API to scan the image
        one by one in background, so there's no way to track the overall status
        of the "scan all" action.  Only system adim has permission to call this
        API.  
      parameters:
        - name: project_id
          in: query
          type: integer
          description: >-
            When this parm is set only the images under the project identified
            by the project_id will be scanned.
      responses:
        '202':
          description: >-
            The action is successully taken in the background.  If some images
            are failed to scan it will only be reflected in the job status.
        '401':
          description: User needs to login or call the API with correct credentials.
        '403':
          description: User doesn't have permission to perform the action.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Failed to initiate the action.
        '503':
          description: Harbor is not deployed with Clair.
  '/repositories/{repo_name}/tags/{tag}/vulnerability/details':
    get:
      summary: Get vulnerability details of the image.
      description: >
        Call Clair API to get the vulnerability based on the previous successful
        scan.
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: Repository name
        - name: tag
          in: path
          type: string
          required: true
          description: Tag name
      tags:
        - Products
      responses:
        '200':
          description: Successfully retrieved the vulnerabilities.
          schema:
            type: array
            items:
              $ref: '#/definitions/VulnerabilityItem'
        '401':
          description: User needs to login or call the API with correct credentials.
        '403':
          description: User doesn't have permission to perform the action.
        '404':
          description: The image does not exist in Harbor.
        '503':
          description: Harbor is not deployed with Clair.
  '/repositories/{repo_name}/signatures':
    get:
      summary: Get signature information of a repository
      description: >
        This endpoint aims to retrieve signature information of a repository,
        the data is

        from the nested notary instance of Harbor.

        If the repository does not have any signature information in notary,
        this API will

        return an empty list with response code 200, instead of 404
      parameters:
        - name: repo_name
          in: path
          type: string
          required: true
          description: repository name.
      tags:
        - Products
      responses:
        '200':
          description: Retrieved signatures.
          schema:
            type: array
            items:
              $ref: '#/definitions/RepoSignature'
        '500':
          description: Server side error.
  /repositories/top:
    get:
      summary: Get public repositories which are accessed most.
      description: |
        This endpoint aims to let users see the most popular public repositories
      parameters:
        - name: count
          in: query
          type: integer
          format: int32
          required: false
          description: >-
            The number of the requested public repositories, default is 10 if
            not provided.
      tags:
        - Products
      responses:
        '200':
          description: Get popular repositories successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/Repository'
        '400':
          description: Bad request because of invalid count.
        '500':
          description: Unexpected internal errors.
  /logs:
    get:
      summary: Get recent logs of the projects which the user is a member of
      description: >
        This endpoint let user see the recent operation logs of the projects
        which he is member of 
      parameters:
        - name: username
          in: query
          type: string
          required: false
          description: Username of the operator.
        - name: repository
          in: query
          type: string
          required: false
          description: The name of repository
        - name: tag
          in: query
          type: string
          required: false
          description: The name of tag
        - name: operation
          in: query
          type: string
          required: false
          description: The operation
        - name: begin_timestamp
          in: query
          type: string
          required: false
          description: The begin timestamp
        - name: end_timestamp
          in: query
          type: string
          required: false
          description: The end timestamp
        - name: page
          in: query
          type: integer
          format: int32
          required: false
          description: 'The page nubmer, default is 1.'
        - name: page_size
          in: query
          type: integer
          format: int32
          required: false
          description: 'The size of per page, default is 10, maximum is 100.'
      tags:
        - Products
      responses:
        '200':
          description: Get the required logs successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/AccessLog'
        '400':
          description: Bad request because of invalid parameters.
        '401':
          description: User need to login first.
        '500':
          description: Unexpected internal errors.
  /jobs/replication:
    get:
      summary: List filters jobs according to the policy and repository
      description: >
        This endpoint let user list filters jobs according to the policy and
        repository. (if start_time and end_time are both null, list jobs of last
        10 days)
      tags:
        - Products
      parameters:
        - name: policy_id
          in: query
          type: integer
          format: int
          required: true
          description: The ID of the policy that triggered this job.
        - name: num
          in: query
          type: integer
          format: int32
          required: false
          description: The return list length number.
        - name: end_time
          in: query
          type: integer
          format: int64
          required: false
          description: The end time of jobs done. (Timestamp)
        - name: start_time
          in: query
          type: integer
          format: int64
          required: false
          description: The start time of jobs. (Timestamp)
        - name: repository
          in: query
          type: string
          required: false
          description: The respond jobs list filter by repository name.
        - name: status
          in: query
          type: string
          required: false
          description: The respond jobs list filter by status.
        - name: page
          in: query
          type: integer
          format: int32
          required: false
          description: 'The page nubmer, default is 1.'
        - name: page_size
          in: query
          type: integer
          format: int32
          required: false
          description: 'The size of per page, default is 10, maximum is 100.'
      responses:
        '200':
          description: Get the required logs successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/JobStatus'
          headers:
            X-Total-Count:
              description: The total count of jobs
              type: integer
            Link:
              description: Link refers to the previous page and next page
              type: string
        '400':
          description: Bad request because of invalid parameters.
        '401':
          description: User need to login first.
        '500':
          description: Unexpected internal errors.
    put:
      summary: Update status of jobs. Only stop is supported for now.
      description: |
        The endpoint is used to stop the replication jobs of a policy.
      tags:
        - Products
      parameters:
        - name: policyinfo
          in: body
          description: The policy ID and status.
          required: true
          schema:
            $ref: '#/definitions/UpdateJobs'
      responses:
        '200':
          description: Update the status successfully.
        '400':
          description: Bad request because of invalid parameters.
        '401':
          description: User need to login first.
        '403':
          description: User has no privilege for the operation.
        '404':
          description: Resource requested does not exist.
        '500':
          description: Unexpected internal errors.
  '/jobs/replication/{id}':
    delete:
      summary: Delete specific ID job.
      description: |
        This endpoint is aimed to remove specific ID job from jobservice.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: Delete job ID.
      tags:
        - Products
      responses:
        '200':
          description: Job deleted successfully.
        '400':
          description: Job ID is invalid or can't remove this job.
        '401':
          description: Only admin has this authority.
        '404':
          description: Project ID does not exist.
        '500':
          description: Unexpected internal errors.
  '/jobs/replication/{id}/log':
    get:
      summary: Get job logs.
      description: |
        This endpoint let user search job logs filtered by specific ID.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: Relevant job ID
      tags:
        - Products
      responses:
        '200':
          description: Get job log successfully.
        '400':
          description: Illegal format of provided ID value.
        '401':
          description: User need to log in first.
        '404':
          description: The specific repository ID's log does not exist.
        '500':
          description: Unexpected internal errors.
  '/jobs/scan/{id}/log':
    get:
      summary: Get job logs.
      description: |
        This endpoint let user get scan job logs filtered by specific ID.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: Relevant job ID
      tags:
        - Products
      responses:
        '200':
          description: Get job log successfully.
        '400':
          description: Illegal format of provided ID value.
        '401':
          description: User need to log in first.
        '404':
          description: The specific repository ID's log does not exist.
        '500':
          description: Unexpected internal errors.
  /policies/replication:
    get:
      summary: List filters policies by name and project_id
      description: >
        This endpoint let user list filters policies by name and project_id, if
        name and project_id are nil, list returns all policies
      parameters:
        - name: name
          in: query
          type: string
          required: false
          description: The replication's policy name.
        - name: project_id
          in: query
          type: integer
          format: int64
          required: false
          description: Relevant project ID.
        - name: page
          in: query
          type: integer
          format: int32
          required: false
          description: The page nubmer.
        - name: page_size
          in: query
          type: integer
          format: int32
          required: false
          description: The size of per page.
      tags:
        - Products
      responses:
        '200':
          description: Get policy successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/RepPolicy'
        '400':
          description: Invalid project ID.
        '401':
          description: User need to log in first.
        '500':
          description: Unexpected internal errors.
    post:
      summary: Post creates a policy
      description: >
        This endpoint let user creates a policy, and if it is enabled, the
        replication will be triggered right now.
      parameters:
        - name: policyinfo
          in: body
          description: Create new policy.
          required: true
          schema:
            $ref: '#/definitions/RepPolicy'
      tags:
        - Products
      responses:
        '201':
          description: Create policy successfully.
        '400':
          description: Invalid project ID or target ID.
        '401':
          description: User need to log in first.
        '409':
          description: >-
            Policy name already used or policy already exists with the same
            project and target.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  '/policies/replication/{id}':
    get:
      summary: Get replication policy.
      description: |
        This endpoint let user search replication policy by specific ID.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: policy ID
      tags:
        - Products
      responses:
        '200':
          description: Get job policy successfully.
          schema:
            $ref: '#/definitions/RepPolicy'
        '401':
          description: User need to log in first.
        '404':
          description: The specific repository ID's policy does not exist.
        '500':
          description: Unexpected internal errors.
    put:
      summary: 'Put modifies name, description, target and enablement of policy.'
      description: >
        This endpoint let user update policy name, description, target and
        enablement.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: policy ID
        - name: policyupdate
          in: body
          description: Updated properties of the replication policy.
          required: true
          schema:
            $ref: '#/definitions/RepPolicy'
      tags:
        - Products
      responses:
        '200':
          description: Update job policy content successfully.
        '400':
          description: policy is enabled or target does not exist
        '401':
          description: User need to log in first.
        '404':
          description: The specific repository ID's policy does not exist.
        '409':
          description: >-
            Policy name already used or policy already exists with the same
            project and target.
        '500':
          description: Unexpected internal errors.
  /labels:
    get:
      summary: List labels according to the query strings.
      description: >
        This endpoint let user list labels by name, scope and project_id
      parameters:
        - name: name
          in: query
          type: string
          required: false
          description: The label name.
        - name: scope
          in: query
          type: string
          required: true
          description: The label scope. Valid values are g and p. g for global labels and p for project labels.
        - name: project_id
          in: query
          type: integer
          format: int64
          required: false
          description: Relevant project ID, required when scope is p.
        - name: page
          in: query
          type: integer
          format: int32
          required: false
          description: The page nubmer.
        - name: page_size
          in: query
          type: integer
          format: int32
          required: false
          description: The size of per page.
      tags:
        - Products
      responses:
        '200':
          description: Get successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/Label'
        '400':
          description: Invalid parameters.
        '401':
          description: User need to log in first.
        '500':
          description: Unexpected internal errors.
    post:
      summary: Post creates a label
      description: >
        This endpoint let user creates a label.
      parameters:
        - name: label
          in: body
          description: The json object of label.
          required: true
          schema:
            $ref: '#/definitions/Label'
      tags:
        - Products
      responses:
        '201':
          description: Create successfully.
        '400':
          description: Invalid parameters.
        '401':
          description: User need to log in first.
        '409':
          description: >-
            Label with the same name and same scope already exists.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  '/labels/{id}':
    get:
      summary: Get the label specified by ID.
      description: |
        This endpoint let user get the label by specific ID.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: Label ID
      tags:
        - Products
      responses:
        '200':
          description: Get successfully.
          schema:
            $ref: '#/definitions/Label'
        '401':
          description: User need to log in first.
        '404':
          description: The resource does not exist.
        '500':
          description: Unexpected internal errors.
    put:
      summary: Update the label properties.
      description: >
        This endpoint let user update label properties.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: Label ID
        - name: label
          in: body
          description: The updated label json object.
          required: true
          schema:
            $ref: '#/definitions/Label'
      tags:
        - Products
      responses:
        '200':
          description: Update successfully.
        '400':
          description: Invalid parameters.
        '401':
          description: User need to log in first.
        '404':
          description: The resource does not exist.
        '409':
          description: >-
            The label with the same name already exists.
        '500':
          description: Unexpected internal errors.
    delete:
      summary: Delete the label specified by ID.
      description: >
        Delete the label specified by ID.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: Label ID
      tags:
        - Products
      responses:
        '200':
          description: Delete successfully.
        '400':
          description: Invalid parameters.
        '401':
          description: User need to log in first.
        '404':
          description: The resource does not exist.
        '500':
          description: Unexpected internal errors.
  '/labels/{id}/resources':
    get:
      summary: Get the resources that the label is referenced by.
      description: |
        This endpoint let user get the resources that the label is referenced by. Only the replication policies are returned for now.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: Label ID
      tags:
        - Products
      responses:
        '200':
          description: Get successfully.
          schema:
            $ref: '#/definitions/Resource'
        '401':
          description: User need to log in first.
        '403':
          description: Forbidden.
        '404':
          description: The resource does not exist.
        '500':
          description: Unexpected internal errors.
  /replications:
    post:
      summary: Trigger the replication according to the specified policy.
      description: |
        This endpoint is used to trigger a replication.
      parameters:
        - name: policy ID
          in: body
          description: The ID of replication policy.
          required: true
          schema:
            $ref: '#/definitions/Replication'
      tags:
        - Products
      responses:
        '200':
          description: Trigger the replication successfully.
        '401':
          description: User need to log in first.
        '404':
          description: The policy does not exist.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  /targets:
    get:
      summary: List filters targets by name.
      description: >
        This endpoint let user list filters targets by name, if name is nil,
        list returns all targets.
      parameters:
        - name: name
          in: query
          type: string
          required: false
          description: The replication's target name.
      tags:
        - Products
      responses:
        '200':
          description: Get policy successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/RepTarget'
        '401':
          description: User need to log in first.
        '500':
          description: Unexpected internal errors.
    post:
      summary: Create a new replication target.
      description: |
        This endpoint is for user to create a new replication target.
      parameters:
        - name: reptarget
          in: body
          description: New created replication target.
          required: true
          schema:
            $ref: '#/definitions/RepTargetPost'
      tags:
        - Products
      responses:
        '201':
          description: Replication target created successfully.
        '400':
          description: Unsatisfied with constraints of the target creation.
        '401':
          description: User need to log in first.
        '409':
          description: Replication target name already exists.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  /targets/ping:
    post:
      summary: Ping validates target.
      description: >
        This endpoint is for ping validates whether the target is reachable and
        whether the credential is valid.
      parameters:
        - name: target
          in: body
          description: The target object.
          required: true
          schema:
            $ref: '#/definitions/PingTarget'
      tags:
        - Products
      responses:
        '200':
          description: Ping target successfully.
        '400':
          description: >-
            Target id is invalid/ endpoint is needed/ invaild URL/ network
            issue.
        '401':
          description: >-
            User need to log in first or wrong username/password for remote
            target.
        '404':
          description: Target not found.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  '/targets/{id}':
    put:
      summary: Update replication's target.
      description: |
        This endpoint is for update specific replication's target.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: The replication's target ID.
        - name: repo_target
          in: body
          required: true
          schema:
            $ref: '#/definitions/PutTarget'
          description: Updates of replication's target.
      tags:
        - Products
      responses:
        '200':
          description: Updated replication's target successfully.
        '400':
          description: The target is associated with policy which is enabled.
        '401':
          description: User need to log in first.
        '404':
          description: Target ID does not exist.
        '409':
          description: Target name or endpoint is already used.
        '500':
          description: Unexpected internal errors.
    get:
      summary: Get replication's target.
      description: This endpoint is for get specific replication's target.
      tags:
        - Products
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: The replication's target ID.
      responses:
        '200':
          description: Get replication's target successfully.
          schema:
            $ref: '#/definitions/RepTarget'
        '401':
          description: User need to log in first.
        '404':
          description: Replication's target not found
        '500':
          description: Unexpected internal errors.
    delete:
      summary: Delete specific replication's target.
      description: |
        This endpoint is for to delete specific replication's target.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: The replication's target ID.
      tags:
        - Products
      responses:
        '200':
          description: Replication's target deleted successfully.
        '400':
          description: >-
            Replication's target ID is invalid or the target is used by
            policies.
        '401':
          description: Only admin has this authority.
        '404':
          description: Replication's target does not exist.
        '500':
          description: Unexpected internal errors.
  '/targets/{id}/policies/':
    get:
      summary: List the target relevant policies.
      description: >
        This endpoint list policies filter with specific replication's target
        ID.
      parameters:
        - name: id
          in: path
          type: integer
          format: int64
          required: true
          description: The replication's target ID.
      tags:
        - Products
      responses:
        '200':
          description: Get relevant policies successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/RepPolicy'
        '401':
          description: User need to log in first.
        '404':
          description: Replication's target not found
        '500':
          description: Unexpected internal errors.
  /internal/syncregistry:
    post:
      summary: Sync repositories from registry to DB.
      description: >
        This endpoint is for syncing all repositories of registry with
        database. 
      tags:
        - Products
      responses:
        '200':
          description: Sync repositories successfully.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  /systeminfo:
    get:
      summary: Get general system info
      description: >
        This API is for retrieving general system info, this can be called by
        anonymous request.
      tags:
        - Products
      responses:
        '200':
          description: Get general info successfully.
          schema:
            type: object
            items:
              $ref: '#/definitions/GeneralInfo'
        '500':
          description: Unexpected internal error.
  /systeminfo/volumes:
    get:
      summary: Get system volume info (total/free size).
      description: >
        This endpoint is for retrieving system volume info that only provides
        for admin user.
      tags:
        - Products
      responses:
        '200':
          description: Get system volumes successfully.
          schema:
            type: object
            items:
              $ref: '#/definitions/SystemInfo'
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '500':
          description: Unexpected internal errors.
  /systeminfo/getcert:
    get:
      summary: Get default root certificate under OVA deployment.
      description: >
        This endpoint is for downloading a default root certificate that only
        provides for admin user under OVA deployment.
      tags:
        - Products
      responses:
        '200':
          description: Get default root certificate successfully.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '404':
          description: Not found the default root certificate.
        '500':
          description: Unexpected internal errors.
  /ldap/ping:
    post:
      summary: Ping available ldap service.
      description: >
        This endpoint ping the available ldap service for test related
        configuration parameters. 
      parameters:
        - name: ldapconf
          in: body
          description: >-
            ldap configuration. support input ldap service configuration. If
            it's a empty request, will load current configuration from the
            system.
          required: false
          schema:
            $ref: '#/definitions/LdapConf'
      tags:
        - Products
      responses:
        '200':
          description: Ping ldap service successfully.
        '400':
          description: Inviald ldap configuration parameters.
        '401':
          description: User need to login first.
        '403':
          description: Only admin has this authority.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  /ldap/groups/search:
    get:
      summary: Search available ldap groups.
      description: >
        This endpoint searches the available ldap groups based on related
        configuration parameters. Support searched by input ladp configuration,
        load configuration from the system and specific filter.
      parameters:
        - name: groupname
          in: query
          type: string
          required: false
          description: Ldap group name
      tags:
        - Products
      responses:
        '200':
          description: Search ldap group successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/UserGroup'
        '500':
          description: Unexpected internal errors.
  /ldap/users/search:
    get:
      summary: Search available ldap users.
      description: >
        This endpoint searches the available ldap users based on related
        configuration parameters. Support searched by input ladp configuration,
        load configuration from the system and specific filter.
      parameters:
        - name: username
          in: query
          type: string
          required: false
          description: Registered user ID
      tags:
        - Products
      responses:
        '200':
          description: Search ldap users successfully.
          schema:
            type: array
            items:
              $ref: '#/definitions/LdapUsers'
        '401':
          description: User need to login first.
        '403':
          description: Only admin has this authority.
        '500':
          description: Unexpected internal errors.
  /ldap/users/import:
    post:
      summary: Import selected available ldap users.
      description: >
        This endpoint adds the selected available ldap users to harbor based on
        related configuration parameters from the system. System will try to
        guess the user email address and realname, add to harbor user
        information. 

        If have errors when import user, will return the list of importing
        failed uid and the failed reason.
      parameters:
        - name: uid_list
          in: body
          description: >-
            The uid listed for importing. This list will check users validity of
            ldap service based on configuration from the system.
          required: true
          schema:
            $ref: '#/definitions/LdapImportUsers'
      tags:
        - Products
      responses:
        '200':
          description: Add ldap users successfully.
        '401':
          description: User need to login first.
        '403':
          description: Only admin has this authority.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '404':
          description: Failed import some users.
          schema:
            type: array
            items:
              $ref: '#/definitions/LdapFailedImportUsers'
  /usergroups:
   get:
    summary: Get all user groups information
    description: Get all user groups information
    tags:
     - Products
    responses:
      '200':
        description: Get user group successfully.
        schema:
          type: array
          items:
            $ref: '#/definitions/UserGroup'
      '401':
        description: User need to log in first.
      '403':
        description: User in session does not have permission to the user group.
      '500':
        description: Unexpected internal errors.      
   post:
      summary: Create user group
      description: Create user group information
      tags:
        - Products    
      parameters:
        - name: usergroup
          in: body
          schema:
            $ref: '#/definitions/UserGroup'
      responses:
        '201':
          description: User group created successfully.
        '400':
          description: Invalid LDAP group DN.
        '401':
          description: User need to log in first.
        '403':
          description: User in session does not have permission to the user group.
        '404':
          description: The LDAP group is not found.  
        '409':
          description: An LDAP user group with same DN already exist. 
        '500':
          description: Unexpected internal errors.        
  /usergroups/{group_id}:
   get:
    summary: Get user group information
    description: Get user group information
    tags:
     - Products
    parameters:
     - name: group_id
       in: path
       type: integer
       format: int64
       required: true
       description: Group ID
    responses:
      '200':
        description: User group get successfully.
        schema:
          $ref: '#/definitions/UserGroup'
      '400':
        description: The user group id is invalid.
      '401':
        description: User need to log in first.
      '403':
        description: User in session does not have permission to the user group.
      '404':
        description: User group does not exist.
      '500':
        description: Unexpected internal errors.  
   put:
     summary: Update group information
     description: Update user group information
     tags:
       - Products
     parameters:
       - name: group_id
         in: path
         type: integer
         format: int64
         required: true
         description: Group ID
       - name: usergroup
         in: body
         required: false
         schema:
           $ref: '#/definitions/UserGroup'
     responses:
       '200':
         description: User group updated successfully.
       '400':
         description: The user group id is invalid.
       '401':
         description: User need to log in first.
       '403':
         description: Only admin has this authority.
       '404':
         description: User group does not exist.
       '500':
         description: Unexpected internal errors.  
   delete:
    summary: Delete user group
    description: Delete user group
    tags:
     - Products
    parameters:
     - name: group_id
       type: integer
       in: path
       required: true
    responses:
      '200':
        description: User group deleted successfully.
      '400':
        description: The user group id is invalid.
      '401':
        description: User need to log in first.
      '403':
        description: Only admin has this authority.
      '500':
        description: Unexpected internal errors.       

  /configurations:
    get:
      summary: Get system configurations.
      description: >
        This endpoint is for retrieving system configurations that only provides
        for admin user.
      tags:
        - Products
      responses:
        '200':
          description: Get system configurations successfully. The response body is a map.
          schema:
            $ref: '#/definitions/Configurations'
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '500':
          description: Unexpected internal errors.
    put:
      summary: Modify system configurations.
      description: >
        This endpoint is for modifying system configurations that only provides
        for admin user.
      tags:
        - Products
      parameters:
        - name: configurations
          in: body
          required: true
          schema:
            $ref: '#/definitions/Configurations'
          description: >-
            The configuration map can contain a subset of the attributes of the
            schema, which are to be updated.
      responses:
        '200':
          description: Modify system configurations successfully.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '500':
          description: Unexpected internal errors.
  /configurations/reset:
    post:
      summary: Reset system configurations.
      description: >
        Reset system configurations from environment variables. Can only be
        accessed by admin user.
      tags:
        - Products
      responses:
        '200':
          description: Reset system configurations successfully.
        '401':
          description: User need to log in first.
        '403':
          description: User does not have permission of admin role.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
  /email/ping:
    post:
      summary: Test connection and authentication with email server.
      description: |
        Test connection and authentication with email server. 
      parameters:
        - name: settings
          in: body
          description: >-
            Email server settings, if some of the settings are not assigned,
            they will be read from system configuration.
          required: false
          schema:
            $ref: '#/definitions/EmailServerSetting'
      tags:
        - Products
      responses:
        '200':
          description: Ping email server successfully.
        '400':
          description: Inviald email server settings.
        '401':
          description: User need to login first.
        '403':
          description: Only admin has this authority.
        '415':
          $ref: '#/responses/UnsupportedMediaType'
        '500':
          description: Unexpected internal errors.
responses:
  UnsupportedMediaType: 
    description: The Media Type of the request is not supported, it has to be "application/json"

definitions:
  Search:
    type: object
    properties:
      projects:
        description: Search results of the projects that matched the filter keywords.
        type: array
        items:
          $ref: '#/definitions/Project'
      repositories:
        description: Search results of the repositories that matched the filter keywords.
        type: array
        items:
          $ref: '#/definitions/SearchRepository'
  SearchRepository:
    type: object
    properties:
      project_id:
        type: integer
        description: The ID of the project that the repository belongs to
      project_name:
        type: string
        description: The name of the project that the repository belongs to
      project_public:
        type: integer
        description: >-
          The flag to indicate the publicity of the project that the repository
          belongs to (1 is public, 0 is not)
      repository_name:
        type: string
        description: The name of the repository
      pull_count:
        type: integer
        description: The count how many times the repository is pulled
      tags_count:
        type: integer
        description: The count of tags in the repository
  ProjectReq:
    type: object
    properties:
      project_name:
        type: string
        description: The name of the project.
      metadata:
        description: The metadata of the project.
        $ref: '#/definitions/ProjectMetadata'
  Project:
    type: object
    properties:
      project_id:
        type: integer
        format: int32
        description: Project ID
      owner_id:
        type: integer
        format: int32
        description: The owner ID of the project always means the creator of the project.
      name:
        type: string
        description: The name of the project.
      creation_time:
        type: string
        description: The creation time of the project.
      update_time:
        type: string
        description: The update time of the project.
      deleted:
        type: integer
        format: int32
        description: 'A deletion mark of the project (1 means it''s deleted, 0 is not)'
      owner_name:
        type: string
        description: The owner name of the project.
      togglable:
        type: boolean
        description: >-
          Correspond to the UI about whether the project's publicity is 
          updatable (for UI)
      current_user_role_id:
        type: integer
        description: The role ID of the current user who triggered the API (for UI)
      repo_count:
        type: integer
        description: The number of the repositories under this project.
      metadata:
        description: The metadata of the project.
        $ref: '#/definitions/ProjectMetadata'
  ProjectMetadata:
    type: object
    properties:
      public:
        type: string
        description: The public status of the project. The valid values are "true", "false".
      enable_content_trust:
        type: string
        description: >-
          Whether content trust is enabled or not. If it is enabled, user cann't
          pull unsigned images from this project. The valid values are "true", "false".
      prevent_vulnerable_images_from_running:
        type: string
        description: Whether prevent the vulnerable images from running. The valid values are "true", "false".
      prevent_vulnerable_images_from_running_severity:
        type: string
        description: >-
          If the vulnerability is high than severity defined here, the images
          cann't be pulled. The valid values are "negligible", "low", "medium", "high", "critical".
      automatically_scan_images_on_push:
        type: string
        description: Whether scan images automatically when pushing. The valid values are "true", "false".
  Manifest:
    type: object
    properties:
      manifest:
        type: object
        description: The detail of manifest.
      config:
        type: string
        description: The config of the repository.
  User:
    type: object
    properties:
      user_id:
        type: integer
        format: int
        description: The ID of the user.
      username:
        type: string
      email:
        type: string
      password:
        type: string
      realname:
        type: string
      comment:
        type: string
      deleted:
        type: integer
        format: int32
      role_name:
        type: string
      role_id:
        type: integer
        format: int
      has_admin_role:
        type: integer
        format: int
      reset_uuid:
        type: string
      Salt:
        type: string
      creation_time:
        type: string
      update_time:
        type: string
  Password:
    type: object
    properties:
      old_password:
        type: string
        description: The user's existing password.
      new_password:
        type: string
        description: New password for marking as to be updated.
  AccessLog:
    type: object
    properties:
      log_id:
        type: integer
        description: The ID of the log entry.
      username:
        type: string
        description: Username of the user in this log entry.
      repo_name:
        type: string
        description: Name of the repository in this log entry.
      repo_tag:
        type: string
        description: Tag of the repository in this log entry.
      operation:
        type: string
        description: The operation against the repository in this log entry.
      op_time:
        type: string
        description: The time when this operation is triggered.
  Role:
    type: object
    properties:
      role_id:
        type: integer
        format: int32
        description: ID in table.
      role_code:
        type: string
        description: Description of permissions for the role.
      role_name:
        type: string
        description: Name the the role.
      role_mask:
        type: string
  RoleParam:
    type: object
    properties:
      roles:
        type: array
        items:
          type: integer
          format: int32
        description: Role ID for updating project role member.
      username:
        type: string
        description: Username relevant to a project role member.
  StatisticMap:
    type: object
    properties:
      private_project_count:
        type: integer
        format: int32
        description: The count of the private projects which the user is a member of.
      private_repo_count:
        type: integer
        format: int32
        description: >-
          The count of the private repositories belonging to the projects which
          the user is a member of.
      public_project_count:
        type: integer
        format: int32
        description: The count of the public projects.
      public_repo_count:
        type: integer
        format: int32
        description: >-
          The count of the public repositories belonging to the public projects
          which the user is a member of.
      total_project_count:
        type: integer
        format: int32
        description: 'The count of the total projects, only be seen when the is admin.'
      total_repo_count:
        type: integer
        format: int32
        description: >-
          The count of the total repositories, only be seen when the user is
          admin.
  JobStatus:
    type: object
    properties:
      id:
        type: integer
        format: int64
        description: The job ID.
      status:
        type: string
        description: The status of the job.
      repository:
        type: string
        description: The repository handled by the job.
      policy_id:
        type: integer
        format: int64
        description: The ID of the policy that triggered this job.
      operation:
        type: string
        description: The operation of the job.
      tags:
        type: array
        description: The repository's used tag list.
        items:
          $ref: '#/definitions/Tags'
      creation_time:
        type: string
        description: The creation time of the job.
      update_time:
        type: string
        description: The update time of the job.
  Tags:
    type: object
    properties:
      tag:
        type: string
        description: The repository's used tag.
  RepPolicy:
    type: object
    properties:
      id:
        type: integer
        format: int64
        description: The policy ID.
      name:
        type: string
        description: The policy name.
      description:
        type: string
        description: The description of the policy.
      projects:
        type: array
        description: The project list that the policy applys to.
        items:
          $ref: '#/definitions/Project'
      targets:
        type: array
        description: The target list.
        items:
          $ref: '#/definitions/RepTarget'
      trigger:
        $ref: '#/definitions/RepTrigger'
      filters:
        type: array
        description: The replication policy filter array.
        items:
          $ref: '#/definitions/RepFilter'
      replicate_existing_image_now:
        type: boolean
        description: Whether to replicate the existing images now.
      replicate_deletion:
        type: boolean
        description: Whether to replicate the deletion operation.
      creation_time:
        type: string
        description: The create time of the policy.
      update_time:
        type: string
        description: The update time of the policy.
      error_job_count:
        type: integer
        description: The error job count number for the policy.
  RepTrigger:
    type: object
    properties:
      kind:
        type: string
        description: >-
          The replication policy trigger kind. The valid values are manual,
          immediate and schedule.
      schedule_param:
        $ref: '#/definitions/ScheduleParam'
  ScheduleParam:
    type: object
    properties:
      type:
        type: string
        description: The schedule type. The valid values are daily and weekly.
      weekday:
        type: integer
        format: int8
        description: 'Optional, only used when the type is weedly. The valid values are 1-7.'
      offtime:
        type: integer
        format: int64
        description: 'The time offset with the UTC 00:00 in seconds.'
  RepFilter:
    type: object
    properties:
      kind:
        type: string
        description: >-
          The replication policy filter kind. The valid values are project,
          repository and tag.
      value:
        type: string
        description: The value of replication policy filter. When creating repository and tag filter, filling it with the pattern as string. When creating label filter, filling it with label ID as integer.
      pattern:
        type: string
        description: Depraceted, use value instead. The replication policy filter pattern.
      metadata:
        type: object
        description: This map object is the replication policy filter metadata.
  RepTarget:
    type: object
    properties:
      id:
        type: integer
        format: int64
        description: The target ID.
      endpoint:
        type: string
        description: The target address URL string.
      name:
        type: string
        description: The target name.
      username:
        type: string
        description: The target server username.
      password:
        type: string
        description: The target server password.
      type:
        type: integer
        format: int
        description: Reserved field.
      insecure:
        type: boolean
        description: >-
          Whether or not the certificate will be verified when Harbor tries to
          access the server.
      creation_time:
        type: string
        description: The create time of the policy.
      update_time:
        type: string
        description: The update time of the policy.
  RepTargetPost:
    type: object
    properties:
      endpoint:
        type: string
        description: The target address URL string.
      name:
        type: string
        description: The target name.
      username:
        type: string
        description: The target server username.
      password:
        type: string
        description: The target server password.
      insecure:
        type: boolean
        description: >-
          Whether or not the certificate will be verified when Harbor tries to
          access the server.
  PingTarget:
    type: object
    properties:
      id:
        type: integer
        format: int
        description: Target ID.
      endpoint:
        type: string
        description: The target address URL string.
      username:
        type: string
        description: The target server username.
      password:
        type: string
        description: The target server password.
      insecure:
        type: boolean
        description: >-
          Whether or not the certificate will be verified when Harbor tries to
          access the server.
  PutTarget:
    type: object
    properties:
      name:
        type: string
        description: The target name.
      endpoint:
        type: string
        description: The target address URL string.
      username:
        type: string
        description: The target server username.
      password:
        type: string
        description: The target server password.
      insecure:
        type: boolean
        description: >-
          Whether or not the certificate will be verified when Harbor tries to
          access the server.
  HasAdminRole:
    type: object
    properties:
      has_admin_role:
        type: integer
        description: '1-has admin, 0-not.'
  UserProfile:
    type: object
    properties:
      email:
        type: string
        description: The new email.
      realname:
        type: string
        description: The new realname.
      comment:
        type: string
        description: The new comment.
  Storage:
    type: object
    properties:
      total:
        type: integer
        format: int64
        description: Total volume size.
      free:
        type: integer
        format: int64
        description: Free volume size.
  GeneralInfo:
    type: object
    properties:
      with_notary:
        type: boolean
        description: If the Harbor instance is deployed with nested notary.
      with_clair:
        type: boolean
        description: If the Harbor instance is deployed with nested clair.
      with_admiral:
        type: boolean
        description: If the Harbor instance is deployed with Admiral.
      admiral_endpoint:
        type: string
        description: The url of the endpoint of admiral instance.
      auth_mode:
        type: string
        description: The auth mode of current Harbor instance.
      project_creation_restriction:
        type: string
        description: >-
          Indicate who can create projects, it could be 'adminonly' or
          'everyone'.
      self_registration:
        type: boolean
        description: Indicate whether the Harbor instance enable user to register himself.
      has_ca_root:
        type: boolean
        description: >-
          Indicate whether there is a ca root cert file ready for download in
          the file system.
      harbor_version:
        type: string
        description: The build version of Harbor.
      next_scan_all:
        type: integer
        description: >-
          The UTC time in milliseconds, after which user can call scanAll API to
          scan all images.
      clair_vulnerability_status:
        type: object
        description: The status of vulnerability data of Clair.
        properties:
          overall_last_update:
            type: integer
            description: >-
              The UTC timestamp in milliseconds of last successful update for
              Clair vulnerability data, when all the updaters are successfully
              executed.
          details:
            type: array
            description: >-
              Detail timestamp of different namespace.  This is introduced to
              handle the case when some updaters are executed successfully and
              some not.
            items:
              $ref: '#/definitions/VulnNamespaceTimestamp'
  VulnNamespaceTimestamp:
    type: object
    properties:
      namespace:
        type: string
        description: The namespace of the Vulnerability
      last_update:
        type: integer
        description: >-
          The UTC timestamp in miliseconds of last successful update for
          vulnerability data.
  SystemInfo:
    type: object
    properties:
      storage:
        type: array
        description: The storage of system.
        items:
          $ref: '#/definitions/Storage'
  LdapConf:
    type: object
    properties:
      ldap_url:
        type: string
        description: The url of ldap service.
      ldap_search_dn:
        type: string
        description: The search dn of ldap service.
      ldap_search_password:
        type: string
        description: The search password of ldap service.
      ldap_base_dn:
        type: string
        description: The base dn of ldap service.
      ldap_filter:
        type: string
        description: The serach filter of ldap service.
      ldap_uid:
        type: string
        description: The serach uid from ldap service attributes.
      ldap_scope:
        type: integer
        format: int64
        description: The serach scope of ldap service.
      ldap_connection_timeout:
        type: integer
        format: int64
        description: The connect timeout of ldap service(second).
  LdapUsers:
    type: object
    properties:
      ldap_username:
        type: string
        description: search ldap user name based on ldapconf.
      ldap_realname:
        type: string
        description: >-
          system will try to guess the user realname form "uid" or "cn"
          attribute.
      ldap_email:
        type: string
        description: >-
          system will try to guess the user email address form "mail" or "email"
          attribute.
  LdapImportUsers:
    type: object
    properties:
      ldap_uid_list:
        type: array
        description: selected uid list
        items:
          type: string
  LdapFailedImportUsers:
    type: object
    properties:
      ldap_uid:
        type: string
        description: the uid can't add to system.
      error:
        type: string
        description: fail reason.
  EmailServerSetting:
    type: object
    properties:
      email_host:
        type: string
        description: The host of email server.
      email_port:
        type: integer
        description: The port of email server.
      email_username:
        type: string
        description: The username of email server.
      email_password:
        type: string
        description: The password of email server.
      email_ssl:
        type: boolean
        description: Use ssl/tls or not.
      email_identity:
        type: string
        description: The dentity of email server.
  RepoSignature:
    type: object
    properties:
      tag:
        type: string
        description: The tag of image.
      hashes:
        type: object
        description: The JSON object of the hash of the image.
  DetailedTag:
    type: object
    properties:
      digest:
        type: string
        description: The digest of the tag.
      name:
        type: string
        description: The name of the tag.
      size:
        type: integer
        description: The size of the image.
      architecture:
        type: string
        description: The architecture of the image.
      os:
        type: string
        description: The os of the image.
      docker_version:
        type: string
        description: The version of docker which builds the image.
      author:
        type: string
        description: The author of the image.
      created:
        type: string
        description: The build time of the image.
      signature:
        type: object
        description: >-
          The signature of image, defined by RepoSignature. If it is null, the
          image is unsigned.
      scan_overview:
        type: object
        description: The overview of the scan result.  This is an optional property.
        properties:
          digest:
            type: string
            description: The digest of the image.
          scan_status:
            type: string
            description: >-
              The status of the scan job, it can be "pendnig", "running",
              "finished", "error".
          job_id:
            type: integer
            description: The ID of the job on jobservice to scan the image.
          severity:
            type: integer
            description: '0-Not scanned, 1-Negligible, 2-Unknown, 3-Low, 4-Medium, 5-High'
          details_key:
            type: string
            description: >-
              The top layer name of this image in Clair, this is for calling
              Clair API to get the vulnerability list of this image.
          components:
            type: object
            description: The components overview of the image.
            properties:
              total:
                type: integer
                description: Total number of the components in this image.
              summary:
                description: List of number of components of different severities.
                type: array
                items:
                  $ref: '#/definitions/ComponentOverviewEntry'
      labels:
        type: array
        description: The label list.
        items:
          $ref: '#/definitions/Label'
  ComponentOverviewEntry:
    type: object
    properties:
      severity:
        type: integer
        description: '1-None/Negligible, 2-Unknown, 3-Low, 4-Medium, 5-High'
      count:
        type: integer
        description: number of the components with certain severity.
  Repository:
    type: object
    properties:
      id:
        type: integer
        description: The ID of repository.
      name:
        type: string
        description: The name of repository.
      project_id:
        type: integer
        description: The project ID of repository.
      description:
        type: string
        description: The description of repository.
      pull_count:
        type: integer
        description: The pull count of repository.
      star_count:
        type: integer
        description: The star count of repository.
      tags_count:
        type: integer
        description: The tags count of repository.
      labels:
        type: array
        description: The label list.
        items:
          $ref: '#/definitions/Label'
      creation_time:
        type: string
        description: The creation time of repository.
      update_time:
        type: string
        description: The update time of repository.
  VulnerabilityItem:
    type: object
    properties:
      id:
        type: string
        description: 'ID of the vulnerability, normally it is the CVE ID'
      severity:
        type: integer
        description: '1-Negligible, 2-Unknown, 3-Low, 4-Medium, 5-High'
      package:
        type: string
        description: The packge that introduces the vulnerability.
      version:
        type: string
        description: The version of the package.
      description:
        type: string
        description: The description of the vulnerability.
      fixedVersion:
        type: string
        description: >-
          The version which the vulnerability is fixed, this is an optional
          property.
  Configurations:
    type: object
    properties:
      auth_mode:
        type: string
        description: 'The auth mode of current system, such as "db_auth", "ldap_auth"'
      email_from:
        type: string
        description: The sender name for Email notification.
      email_host:
        type: string
        description: The hostname of SMTP server that sends Email notification.
      email_port:
        type: integer
        description: The port of SMTP server.
      email_identity:
        type: string
        description: By default it's empty so the email_username is picked.
      email_username:
        type: string
        description: The username for authenticate against SMTP server.
      email_ssl:
        type: boolean
        description: >-
          When it's set to true the system will access Email server via TLS by
          default.  If it's set to false, it still will handle "STARTTLS" from
          server side.
      email_insecure:
        type: boolean
        description: >-
          Whether or not the certificate will be verified when Harbor tries to
          access the email server.
      ldap_url:
        type: string
        description: The URL of LDAP server.
      ldap_base_dn:
        type: string
        description: The Base DN for LDAP binding.
      ldap_filter:
        type: string
        description: The filter for LDAP binding.
      ldap_scope:
        type: integer
        description: '0-LDAP_SCOPE_BASE, 1-LDAP_SCOPE_ONELEVEL, 2-LDAP_SCOPE_SUBTREE'
      ldap_uid:
        type: string
        description: >-
          The attribute which is used as identity for the LDAP binding, such as
          "CN" or "SAMAccountname"
      ldap_search_dn:
        type: string
        description: The DN of the user to do the search.
      ldap_timeout:
        type: integer
        description: timeout in seconds for connection to LDAP server.
      ldap_group_attribute_name:
        type: string
        description: The attribute which is used as identity of the LDAP group, default is cn.
      ldap_group_base_dn:
        type: string
        description: The base DN to search LDAP group.
      ldap_group_search_filter:
        type: string
        description: The filter to search the ldap group.
      ldap_group_search_scope:
        type: integer
        description: The scope to search ldap. '0-LDAP_SCOPE_BASE, 1-LDAP_SCOPE_ONELEVEL, 2-LDAP_SCOPE_SUBTREE'
      project_creation_restriction:
        type: string
        description: >-
          This attribute restricts what users have the permission to create
          project.  It can be "everyone" or "adminonly".
      read_only:
        type: boolean
        description: >-
          'docker push' is prohibited by Harbor if you set it to true.   
      self_registration:
        type: boolean
        description: >-
          Whether the Harbor instance supports self-registration.  If it's set
          to false, admin need to add user to the instance.
      token_expiration:
        type: integer
        description: 'The expiration time of the token for internal Registry, in minutes.'
      verify_remote_cert:
        type: boolean
        description: >-
          Whether or not the certificate will be verified when Harbor tries to
          access a remote Harbor instance for replication.
      scan_all_policy:
        type: object
        properties:
          type:
            type: string
            description: >-
              The type of scan all policy, currently the valid values are "none"
              and "daily"
          parameter:
            type: object
            properties:
              daily_time:
                type: integer
                description: >-
                  The offest in seconds of UTC 0 o'clock, only valid when the
                  policy type is "daily"
            description: >-
              The parameters of the policy, the values are dependant on the type
              of the policy.
  Replication:
    type: object
    properties:
      policy_id:
        type: integer
        description: The ID of replication policy
  RepositoryDescription:
    type: object
    properties:
      description:
        type: string
        description: The description of the repository.
  UpdateJobs:
    type: object
    properties:
      policy_id:
        type: integer
        description: The ID of replication policy
      status:
        type: string
        description: The status of jobs. The only valid value is stop for now.
  Label:
    type: object
    properties:
      id:
        type: integer
        description: The ID of label.
      name:
        type: string
        description: The name of label.
      description:
        type: string
        description: The description of label.
      color:
        type: string
        description: The color of label.
      scope:
        type: string
        description: The scope of label, g for global labels and p for project labels.
      project_id:
        type: integer
        description: The project ID if the label is a project label.
      creation_time:
        type: string
        description: The creation time of label.
      update_time:
        type: string
        description: The update time of label.
      deleted:
        type: boolean
        description: The label is deleted or not.
  ProjectMemberEntity:
    type: object
    properties:
      id:
        type: integer
        description: the project member id
      project_id:
        type: integer
        description: the project id
      entity_name:
        type: string
        description: the name of the group member. 
      role_name:
        type: string
        description: the name of the role
      role_id: 
        type: integer
        description: the role id
      entity_id: 
        type: integer
        description: the id of entity, if the member is an user, it is user_id in user table. if the member is an user group, it is the user group's ID in user_group table.
      entity_type:
        type: string
        description: the entity's type, u for user entity, g for group entity.
  ProjectMember:
    type: object
    properties:
      role_id:
        type: integer
        description: The role id 1 for projectAdmin, 2 for developer, 3 for guest
      member_user:
        $ref: '#/definitions/UserEntity'  
      member_group:
        $ref: '#/definitions/UserGroup'  
  RoleRequest:
    type: object
    properties:
      role_id:
        type: integer
        description: The role id 1 for projectAdmin, 2 for developer, 3 for guest
  UserEntity:
    type: object
    properties:
      user_id:
        type: integer
        description: The ID of the user.
      username:
        type: string
        description: The name of the user.
  UserGroup:
    type: object
    properties:
      id:
        type: integer
        description: The ID of the user group
      group_name:
        type: string
        description: The name of the user group
      group_type: 
        type: integer
        description: The group type, 1 for LDAP group.
      ldap_group_dn:
        type: string
        description: The DN of the LDAP group if group type is 1 (LDAP group).
  Resource:
    type: object
    properties:
      replication_policies:
        type: array
        description: The replication policy list.
        items:
          $ref: '#/definitions/RepPolicy'