...
8. Write a command class that implements the correct annotations for a command: (Note: (1) by using authorized annotation, we can enabled this API by default for a given set of role types, (2) by using the validations annotation on @Parameter field we can perform ApiArgValidator.NotNullOrEmpty checks on string types and ApiArgValidator.PositiveNumber on number types such as short, int, long.)
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package com.cloud.test; import javax.inject.Inject; import org.apache.log4j.Logger; import org.apache.cloudstack.api.ApiArgValidator; import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.acl.RoleType; @APICommand(name = "getTimeOfDay", description="Get Cloudstack's time of day", responseObject = GetTimeOfDayCmdResponse.class, includeInApiDoc=true, authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User}) public class GetTimeOfDayCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(GetTimeOfDayCmd.class.getName()); private static final String s_name = "gettimeofdayresponse"; @Parameter(name="example", type=CommandType.STRING, required=false, description="Just an example string that will be uppercased") , validations private = {ApiArgValidator.NotNullOrEmpty}) private String example; public String getExample() { return this.example; } @Override public void execute() { GetTimeOfDayCmdResponse response = new GetTimeOfDayCmdResponse(); if ( this.example != null ) { response.setExampleEcho(example); } response.setObjectName("timeofday"); // the inner part of the json structure response.setResponseName(getCommandName()); // the outer part of the json structure this.setResponseObject(response); } @Override public String getCommandName() { return s_name; } @Override public long getEntityOwnerId() { return 0; } } |
...
Code Block |
---|
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="timeOfDayManagerImpl" class="com.cloud.test.TimeOfDayManagerImpl"> </bean> </beans> |
11. Update . For CloudStack version 4.8.x and below update client/tomcatconf/commands.properties.in, and add the command name (for the example this would be getTimeOfDay as stated in the @APICommand annotation). For CloudStack 4.9.x and above, the commands.properties.in way has been deprecated and API authors are encouraged to enable their API by default using authorized annotation as in the example above which can be used to enable the API for a given set of user role types.
12. Along with this you need to add your plugin as a dependency to client/pom.xml. You will see examples within the pom, you will require your plugins artifact ID.
...