Hi Chamin,
I will explain how I validation happens when an API is created and updated
using the plugin that I implement.
The WSO2 API management cloud doesn't allow the user to create APIs with
duplicate names and contexts. It also doesn't let the user to create the
same API with a different version. (This can be only done by creating a new
version of the API from the inside) But the user can create organizations
inside the account which can have the same API in two different
organizations.
In the plugin I implement, the API to be exported is compared with the APIs
that are already in the cloud tenant. When comparing it is better to use
both name, version and the provider. But the comparison is done using the
API name and the version. The reason for not involving the provider to
compare the APIs is, as the user provides the access token when enabling
the integration from the Swagger Hub, all the APIs are in that particular
tenant space.
There are several use cases, For more clarification I'll describe one by
one.
1. *If the API you created in Swagger Hub is completely new to the cloud*
- In this case, as there are no matching API in the cloud, just after
the API is saved in the Swagger Hub(after enabling an integration with
WSO2), the API is created in the cloud.
2. *If the API you created in Swagger Hub already exists in the cloud*
- In this case an API with the same name and version exists in the
cloud. When the API is saved from the Swagger Hub, it will not be created
in the cloud as it already exists. It will be updated if there are any
modifications.
3. *If the API you created in the Swagger Hub contain the same context
of another API in the cloud*
- When an API is exported to the cloud from the Swagger Hub, the
plugin checks for a context for the API before saving the API from the
Swagger Hub. Somehow if the context that user provide in the swagger
definition already exists in another API in the cloud, an Exception is
thrown.
4. *If the API you created in the Swagger Hub has the same name but a
different version of the API in the cloud*
- This plugin will throw an Exception when creating the API. The
versioning is only allowed from inside the tenant by creating a
new version
of the API.
In any case, there cannot be two APIs with the same name. Not even with
different contexts, versions.
Thank you,
Akila Aroshana
Software Engineer (Intern)
WSO2
Mobile : +94702178247
Email : [email protected]
LinkedIn : www.linkedin.com/in/akila-amarasinghe
On Sun, Nov 12, 2017 at 6:30 PM, Prasanna Dangalla <[email protected]>
wrote:
> Hi Chamalee,
>
> On Sat, Nov 11, 2017 at 10:02 PM, Chamalee De Silva <[email protected]>
> wrote:
>
>> Hi Prasanna,
>>
>> We do not need to set the status of the API in the payload.
>> Whichever the status that we set or we do not set the status, API will be
>> added to the managed cloud with the status CREATED.
>>
> Yes that was my point to. It will not get published. Someone might get
> mislead when we send the status as PUBLISHED in future documantatiosn or in
> code, hence better to put it as CREATED. Thats Why I asked to make it
> CREATED instead of PUBLISHED.
>
> Thanks
> Prasanna
>
>>
>>
>>
>>
>> Thanks,
>> Chamalee
>>
>> On Sat, Nov 11, 2017 at 4:47 PM, Prasanna Dangalla <[email protected]>
>> wrote:
>>
>>> HI Akila
>>>
>>> On Fri, Nov 10, 2017 at 11:13 AM, Akila Amarasinghe <[email protected]>
>>> wrote:
>>>
>>>> Hi all,
>>>>
>>>> In the mail thread [ARCHITECTURE] [APIM] SwaggerHub Integration with
>>>> WSO2, I gave you an introduction to the project that I am working on.
>>>> In this mail, I will describe how I handle the payload of creating an API
>>>> in the cloud in the plugin that I implement for the Swagger Hub.
>>>>
>>>> Here is the sample payload to create the sample PizzaShackAPI in the
>>>> cloud as in the documentation of WSO2 API manager version 2.1.0.
>>>>
>>>> {
>>>> "name": "PizzaShackAPI",
>>>> "description": "This document describe a RESTFul API for Pizza Shack
>>>> online pizza delivery store.\r\n",
>>>> "context": "/pizzashack",
>>>> "version": "1.0.0",
>>>> "provider": "admin",
>>>> "apiDefinition":
>>>> "{\"paths\":{\"/order\":{\"post\":{\"x-auth-type\":\"Application &
>>>> Application
>>>> User\",\"x-throttling-tier\":\"Unlimited\",\"description\":\"Create a new
>>>> Order\",\"parameters\":[{\"schema\":{\"$ref\":\"#/definitions/Order\"},\"description\":\"Order
>>>> object that needs to be
>>>> added\",\"name\":\"body\",\"required\":true,\"in\":\"body\"}],\"responses\":{\"201\":{\"headers\":{\"Location\":{\"description\":\"The
>>>> URL of the newly created
>>>> resource.\",\"type\":\"string\"}},\"schema\":{\"$ref\":\"#/definitions/Order\"},\"description\":\"Created.\"}}}},\"/menu\":{\"get\":{\"x-auth-type\":\"Application
>>>> & Application
>>>> User\",\"x-throttling-tier\":\"Unlimited\",\"description\":\"Return a list
>>>> of available menu
>>>> items\",\"parameters\":[],\"responses\":{\"200\":{\"headers\":{},\"schema\":{\"title\":\"Menu\",\"properties\":{\"list\":{\"items\":{\"$ref\":\"#/definitions/MenuItem\"},\"type\":\"array\"}},\"type\":\"object\"},\"description\":\"OK.\"}}}}},\"schemes\":[\"https\"],\"produces\":[\"application/json\"],\"swagger\":\"2.0\",\"definitions\":{\"MenuItem\":{\"title\":\"Pizza
>>>> menu
>>>> Item\",\"properties\":{\"price\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"}},\"required\":[\"name\"]},\"Order\":{\"title\":\"Pizza
>>>>
>>>> Order\",\"properties\":{\"customerName\":{\"type\":\"string\"},\"delivered\":{\"type\":\"boolean\"},\"address\":{\"type\":\"string\"},\"pizzaType\":{\"type\":\"string\"},\"creditCardNumber\":{\"type\":\"string\"},\"quantity\":{\"type\":\"number\"},\"orderId\":{\"type\":\"integer\"}},\"required\":[\"orderId\"]}},\"consumes\":[\"application/json\"],\"info\":{\"title\":\"PizzaShackAPI\",\"description\":\"This
>>>> document describe a RESTFul API for Pizza Shack online pizza delivery
>>>> store.\\n\",\"license\":{\"name\":\"Apache
>>>> 2.0\",\"url\":\"http://www.apache.org/licenses/LICENSE-2.0.html\"},\"contact\":{\"email\":\"[email protected]\",\"name\":\"John
>>>> Doe\",\"url\":\"http://www.pizzashack.com\"},\"version\":\"1.0.0\"}}",
>>>> "wsdlUri": null,
>>>> "status": "PUBLISHED",
>>>> "responseCaching": "Disabled",
>>>> "cacheTimeout": 300,
>>>> "destinationStatsEnabled": false,
>>>> "isDefaultVersion": false,
>>>> "type": "HTTP",
>>>> "transport": [
>>>> "http",
>>>> "https"
>>>> ],
>>>> "tags": ["pizza"],
>>>> "tiers": ["Unlimited"],
>>>> "maxTps": {
>>>> "sandbox": 5000,
>>>> "production": 1000
>>>> },
>>>> "visibility": "PUBLIC",
>>>> "visibleRoles": [],
>>>> "visibleTenants": [],
>>>> "endpointConfig":
>>>> "{\"production_endpoints\":{\"url\":\"https://localhost:9443/am/sample/pizzashack/v1/api/\",\"config\":null},\"sandbox_endpoints\":{\"url\":\"https://localhost:9443/am/sample/pizzashack/v1/api/\",\"config\":null},\"endpoint_type\":\"http\"}",
>>>> "endpointSecurity": {
>>>> "username": "user",
>>>> "type": "basic",
>>>> "password": "pass"
>>>> },
>>>> "gatewayEnvironments": "Production and Sandbox",
>>>> "sequences": [],
>>>> "subscriptionAvailability": null,
>>>> "subscriptionAvailableTenants": [],
>>>> "businessInformation": {
>>>> "businessOwnerEmail": "[email protected]",
>>>> "technicalOwnerEmail": "[email protected]",
>>>> "technicalOwner": "John Doe",
>>>> "businessOwner": "Jane Roe"
>>>> },
>>>> "corsConfiguration": {
>>>> "accessControlAllowOrigins": ["*"],
>>>> "accessControlAllowHeaders": [
>>>> "authorization",
>>>> "Access-Control-Allow-Origin",
>>>> "Content-Type",
>>>> "SOAPAction"
>>>> ],
>>>> "accessControlAllowMethods": [
>>>> "GET",
>>>> "PUT",
>>>> "POST",
>>>> "DELETE",
>>>> "PATCH",
>>>> "OPTIONS"
>>>> ],
>>>> "accessControlAllowCredentials": false,
>>>> "corsConfigurationEnabled": false
>>>> }
>>>> }
>>>>
>>>>
>>>> AFAIK when you sent the payload to create the API you need to send the
>>> status as CREATED instead of PUBLISHED.
>>>
>>>
>>>> But I used only the mandatory elements of the payload for creating
>>>> because I had to create a POJO for handling the payload. Here is the
>>>> payload with the mandatory elements.
>>>>
>>>> {
>>>> "name": "Simple Inventory API",
>>>> "context": "/simple",
>>>> "version": "1.0.0",
>>>> "description": "This is a simple API",
>>>> "apiDefinition": "{\"swagger\":\"2.0\",\"info\":{\"description\":\"This
>>>> is a simple API\",\"version\":\"1.0.0\",\"title\":\"Simple Inventory
>>>> API\",\"contact\":{\"email\":\"[email protected]\"},\"license\":{\"name\":\"Apache
>>>>
>>>> 2.0\",\"url\":\"http://www.apache.org/licenses/LICENSE-2.0.html\"}},\"host\":\"virtserver.swaggerhub.com\",\"basePath\":\"/simple\",\"tags\":[{\"name\":\"admins\",\"description\":\"Secured
>>>> Admin-only calls\"},{\"name\":\"developers\",\"description\":\"Operations
>>>> available to regular
>>>> developers\"}],\"schemes\":[\"https\"],\"paths\":{\"/inventory\":{\"get\":{\"tags\":[\"developers\"],\"summary\":\"searches
>>>> inventory\",\"description\":\"By passing in the appropriate options, you
>>>> can search for\\navailable inventory in the
>>>> system\\n\",\"operationId\":\"searchInventory\",\"produces\":[\"application/json\"],\"parameters\":[{\"name\":\"searchString\",\"in\":\"query\",\"description\":\"pass
>>>> an optional search string for looking up
>>>> inventory\",\"required\":false,\"type\":\"string\"},{\"name\":\"skip\",\"in\":\"query\",\"description\":\"number
>>>> of records to skip for
>>>> pagination\",\"required\":false,\"type\":\"integer\",\"minimum\":0,\"format\":\"int32\"},{\"name\":\"limit\",\"in\":\"query\",\"description\":\"maximum
>>>> number of records to
>>>> return\",\"required\":false,\"type\":\"integer\",\"maximum\":50,\"minimum\":0,\"format\":\"int32\"}],\"responses\":{\"200\":{\"description\":\"search
>>>> results matching
>>>> criteria\",\"schema\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/InventoryItem\"}}},\"400\":{\"description\":\"bad
>>>> input parameter\"}}},\"post\":{\"tags\":[\"admins\"],\"summary\":\"adds
>>>> an inventory item\",\"description\":\"Adds an item to the
>>>> system\",\"operationId\":\"addInventory\",\"consumes\":[\"application/json\"],\"produces\":[\"application/json\"],\"parameters\":[{\"in\":\"body\",\"name\":\"inventoryItem\",\"description\":\"Inventory
>>>> item to
>>>> add\",\"required\":false,\"schema\":{\"$ref\":\"#/definitions/InventoryItem\"}}],\"responses\":{\"201\":{\"description\":\"item
>>>> created\"},\"400\":{\"description\":\"invalid input, object
>>>> invalid\"},\"409\":{\"description\":\"an existing item already
>>>> exists\"}}}}},\"definitions\":{\"InventoryItem\":{\"type\":\"object\",\"required\":[\"id\",\"manufacturer\",\"name\",\"releaseDate\"],\"properties\":{\"id\":{\"type\":\"string\",\"format\":\"uuid\",\"example\":\"d290f1ee-6c54-4b01-90e6-d701748f0851\"},\"name\":{\"type\":\"string\",\"example\":\"Widget
>>>>
>>>> Adapter\"},\"releaseDate\":{\"type\":\"string\",\"format\":\"int32\",\"example\":\"2016-08-29T09:12:33.001Z\"},\"manufacturer\":{\"$ref\":\"#/definitions/Manufacturer\"}}},\"Manufacturer\":{\"required\":[\"name\"],\"properties\":{\"name\":{\"type\":\"string\",\"example\":\"ACME
>>>>
>>>> Corporation\"},\"homePage\":{\"type\":\"string\",\"format\":\"url\",\"example\":\"https://www.acme-corp.com\"},\"phone\":{\"type\":\"string\",\"example\":\"408-867-5309
>>>> <(408)%20867-5309>\"}}}}}",
>>>> "isDefaultVersion": false,
>>>> "transport": ["http", "https"],
>>>> "tiers": ["Unlimited"],
>>>> "visibility": "PUBLIC",
>>>> "endpointConfig": "",
>>>> "corsConfiguration": {
>>>> "corsConfigurationEnabled": false
>>>> }
>>>> }
>>>>
>>>>
>>>> More about the payload,
>>>>
>>>> Note : After an integration is enabled with WSO2 API management cloud
>>>> from the Swagger Hub and saving, the API should be created in the WSO2 API
>>>> management cloud in the CREATED state.
>>>>
>>>> - The following elements of the payload are set as default values
>>>> as the cloud user can change these values any time before publishing the
>>>> API.
>>>> - visibility to PUBLIC
>>>> - tiers to UNLIMITED
>>>> - corsConfiguration to false
>>>> - endpointConfig to null
>>>> - The provider element will be returned with the response after
>>>> creating the API in the cloud with the appropriate username of the
>>>> cloud
>>>> user according to the access token the user provide when enabling the
>>>> integration with the cloud from the Swagger Hub.
>>>> - Some swagger definitions generated by the Swagger Hub doesn't
>>>> contain the "basePath" element. You can see a swagger definition without
>>>> the basePath in this link
>>>> <https://app.swaggerhub.com/apis/user1/OAuth2Application/1.0.0>[1].
>>>> So the swagger definition is checked for the basePath before exporting.
>>>> If
>>>> a basePath is not in the definition, the user will have to enter a
>>>> basePath
>>>> to the definition and export.
>>>> - These elements are mapped from the swagger definition to the
>>>> payload
>>>> - title -> name
>>>> - version -> version
>>>> - description -> description
>>>> - basePath -> context
>>>>
>>>> Any feedback is appreciated.
>>>>
>>>> Thank you,
>>>>
>>>> ------------------------------------------------------------
>>>> ------------------------------------------------------------
>>>> -----------------------------
>>>>
>>>> [1] https://app.swaggerhub.com/apis/user1/OAuth2Application/1.0.0
>>>> [2] Refer the mail thread : [ARCHITECTURE] [APIM] SwaggerHub
>>>> Integration with WSO2
>>>>
>>>> Akila Aroshana
>>>> Software Engineer (Intern)
>>>> WSO2
>>>>
>>>> Mobile : +94702178247 <+94%2070%20217%208247>
>>>> Email : [email protected]
>>>> LinkedIn : www.linkedin.com/in/akila-amarasinghe
>>>>
>>>
>>>
>>> _______________________________________________
>>> Architecture mailing list
>>> [email protected]
>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
>>>
>>>
>>
>>
>> --
>> Thanks & Regards,
>>
>> *Chamalee De Silva*
>> Software Engineer
>> *WS**O2* Inc. :http://wso2.com/
>>
>> Office :- *+94 11 2145345 <%2B94%2011%202145345>*
>> mobile :- *+94 7 <%2B94%2077%202782039>1 4315942*
>>
>>
>
> _______________________________________________
> Architecture mailing list
> [email protected]
> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
>
>
_______________________________________________
Architecture mailing list
[email protected]
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture