..
..
.. Licensed under the Apache License, Version 2.0 (the "License");
.. you may not use this file except in compliance with the License.
.. You may obtain a copy of the License at
..
..     http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS,
.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
.. See the License for the specific language governing permissions and
.. limitations under the License.
..

.. _to-api-server-server-capabilities:

******************************
``server_server_capabilities``
******************************

``GET``
=======
Gets all associations of :term:`Server Capabilities` to :term:`Cache Servers`.

:Auth. Required: Yes
:Roles Required: None
:Response Type:  Array

Request Structure
-----------------
.. table:: Request Query Parameters

	+------------------+----------+------------------------------------------------------------------------------------------------------------------------------+
	| Name             | Required | Description                                                                                                                  |
	+==================+==========+==============================================================================================================================+
	| serverId         | no       | Filter :term:`Server Capability` associations by the integral, unique identifier of the server to which they are assigned    |
	+------------------+----------+------------------------------------------------------------------------------------------------------------------------------+
	| serverHostName   | no       | Filter :term:`Server Capability` associations by the host name of the server to which they are assigned                      |
	+------------------+----------+------------------------------------------------------------------------------------------------------------------------------+
	| serverCapability | no       | Filter :term:`Server Capability` associations by :term:`Server Capability` name                                              |
	+------------------+----------+------------------------------------------------------------------------------------------------------------------------------+
	| orderby          | no       | Choose the ordering of the results - must be the name of one of the fields of the objects in the ``response``  array         |
	+------------------+----------+------------------------------------------------------------------------------------------------------------------------------+
	| sortOrder        | no       | Changes the order of sorting. Either ascending (default or "asc") or descending ("desc")                                     |
	+------------------+----------+------------------------------------------------------------------------------------------------------------------------------+
	| limit            | no       | Choose the maximum number of results to return                                                                               |
	+------------------+----------+------------------------------------------------------------------------------------------------------------------------------+
	| offset           | no       | The number of results to skip before beginning to return results. Must use in conjunction with limit.                        |
	+------------------+----------+------------------------------------------------------------------------------------------------------------------------------+
	| page             | no       | Return the n\ :sup:`th` page of results, where "n" is the value of this parameter, pages are ``limit`` long and the first    |
	|                  |          | page is 1. If ``offset`` was defined, this query parameter has no effect. ``limit`` must be defined to make use of ``page``. |
	+------------------+----------+------------------------------------------------------------------------------------------------------------------------------+

.. code-block:: http
	:caption: Request Example

	GET /api/2.0/server_server_capabilities HTTP/1.1
	Host: trafficops.infra.ciab.test
	User-Agent: curl/7.47.0
	Accept: */*
	Cookie: mojolicious=...

Response Structure
------------------
:serverHostName:   The server's host name
:serverId:         The server's integral, unique identifier
:lastUpdated:      The date and time at which this association between the server and the :term:`Server Capability` was last updated, in an ISO-like format
:serverCapability: The :term:`Server Capability`'s name

.. code-block:: http
	:caption: Response Example

	HTTP/1.1 200 OK
	Access-Control-Allow-Credentials: true
	Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Set-Cookie, Cookie
	Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
	Access-Control-Allow-Origin: *
	Content-Type: application/json
	Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 18 Nov 2019 17:40:54 GMT; Max-Age=3600; HttpOnly
	Whole-Content-Sha512: UFO3/jcBFmFZM7CsrsIwTfPc5v8gUiXqJm6BNp1boPb4EQBnWNXZh/DbBwhMAOJoeqDImoDlrLnrVjQGO4AooA==
	X-Server-Name: traffic_ops_golang/
	Date: Mon, 07 Oct 2019 22:15:11 GMT
	Content-Length: 150

	{
		"response": [
			{
				"lastUpdated": "2019-10-07 22:05:31+00",
				"serverHostName": "atlanta-org-1",
				"serverId": 260,
				"serverCapability": "ram"
			},
			{
				"lastUpdated": "2019-10-07 22:05:31+00",
				"serverHostName": "atlanta-org-2",
				"serverId": 261,
				"serverCapability": "disk"
			}
		]
	}

``POST``
========
Associates a :term:`Server Capability` to a server.

:Auth. Required: Yes
:Roles Required: "admin" or "operations"
:Response Type:  Object

Request Structure
-----------------
:serverId:         The integral, unique identifier of a server to be associated with a :term:`Server Capability`
:serverCapability: The :term:`Server Capability`'s name to associate

.. note:: The server referenced must be either an :term:`Edge-tier` or :term:`Mid-tier Cache Server`.

.. code-block:: http
	:caption: Request Example

	POST /api/2.0/server_server_capabilities HTTP/1.1
	Host: trafficops.infra.ciab.test
	User-Agent: curl/7.47.0
	Accept: */*
	Cookie: mojolicious=...
	Content-Length: 84
	Content-Type: application/json

	{
		"serverId": 1,
		"serverCapability": "disk"
	}

Response Structure
------------------
:serverId:         The integral, unique identifier of the newly associated server
:lastUpdated:      The date and time at which this association between the server and the :term:`Server Capability` was last updated, in an ISO-like format
:serverCapability: The :term:`Server Capability`'s name

.. code-block:: http
	:caption: Response Example

	HTTP/1.1 200 OK
	Access-Control-Allow-Credentials: true
	Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Set-Cookie, Cookie
	Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
	Access-Control-Allow-Origin: *
	Content-Type: application/json
	Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 18 Nov 2019 17:40:54 GMT; Max-Age=3600; HttpOnly
	Whole-Content-Sha512: eQrl48zWids0kDpfCYmmtYMpegjnFxfOVvlBYxxLSfp7P7p6oWX4uiC+/Cfh2X9i3G+MQ36eH95gukJqOBOGbQ==
	X-Server-Name: traffic_ops_golang/
	Date: Mon, 07 Oct 2019 22:15:11 GMT
	Content-Length: 157

	{
		"alerts": [
			{
				"text": "server server_capability was created.",
				"level": "success"
			}
		],
		"response": {
			"lastUpdated": "2019-10-07 22:15:11+00",
			"serverId": 1,
			"serverCapability": "disk"
		}
	}

``DELETE``
==========
Disassociate a server from a :term:`Server Capability`.

	.. note:: If the ``serverCapability`` is a :term:`Server Capability` required by a :term:`Delivery Service` that to which the server is assigned the DELETE will be blocked until either the server is unassigned from the :term:`Delivery Service` or the :term:`Server Capability` is no longer required by the :term:`Delivery Service`.

:Auth. Required: Yes
:Roles Required: "admin" or "operations"
:Response Type:  ``undefined``

Request Structure
-----------------
.. table:: Request Query Parameters

	+------------------+----------+-----------------------------------------------------------------+
	| Name             | Required | Description                                                     |
	+==================+==========+=================================================================+
	| serverId         | yes      | The integral, unique identifier of the server to disassociate   |
	+------------------+----------+-----------------------------------------------------------------+
	| serverCapability | yes      | term:`Server Capability` name to disassociate from given server |
	+------------------+----------+-----------------------------------------------------------------+

.. code-block:: http
	:caption: Request Example

	DELETE /api/2.0/server_server_capabilities?serverId=1&serverCapability=disk HTTP/1.1
	Host: trafficops.infra.ciab.test
	User-Agent: curl/7.47.0
	Accept: */*
	Cookie: mojolicious=...

Response Structure
------------------

.. code-block:: http
	:caption: Response Example

	HTTP/1.1 200 OK
	Access-Control-Allow-Credentials: true
	Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Set-Cookie, Cookie
	Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
	Access-Control-Allow-Origin: *
	Content-Type: application/json
	Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 18 Nov 2019 17:40:54 GMT; Max-Age=3600; HttpOnly
	Whole-Content-Sha512: UFO3/jcBFmFZM7CsrsIwTfPc5v8gUiXqJm6BNp1boPb4EQBnWNXZh/DbBwhMAOJoeqDImoDlrLnrVjQGO4AooA==
	X-Server-Name: traffic_ops_golang/
	Date: Mon, 07 Oct 2019 22:15:11 GMT
	Content-Length: 96

	{
		"alerts": [
			{
				"text": "server server_capability was deleted.",
				"level": "success"
			}
		]
	}
