Commit Graph

144 Commits

Author SHA1 Message Date
Rohit Yadav 296b49c2f8 Merge branch 'master' into test-merge-api
Conflicts:
	api/src/com/cloud/agent/api/BackupSnapshotCommand.java
	api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java
	api/src/com/cloud/agent/api/to/PortForwardingRuleTO.java
	api/src/com/cloud/network/NetworkService.java
	api/src/com/cloud/resource/ResourceService.java
	api/src/org/apache/cloudstack/api/ApiConstants.java
	api/src/org/apache/cloudstack/api/ResponseGenerator.java
	api/src/org/apache/cloudstack/api/response/SSHKeyPairResponse.java
	client/tomcatconf/commands.properties.in
	core/src/com/cloud/storage/SnapshotVO.java
	pom.xml
	server/src/com/cloud/api/ApiDispatcher.java
	server/src/com/cloud/api/ApiResponseHelper.java
	server/src/com/cloud/api/ApiServer.java
	server/src/com/cloud/configuration/ConfigurationManagerImpl.java
	server/src/com/cloud/network/NetworkManagerImpl.java
	server/src/com/cloud/network/rules/RulesManagerImpl.java
	server/src/com/cloud/offerings/NetworkOfferingVO.java
	server/src/com/cloud/resource/ResourceManagerImpl.java
	server/src/com/cloud/upgrade/dao/Upgrade40to41.java
	server/src/com/cloud/vm/UserVmManagerImpl.java
	server/test/com/cloud/vpc/MockNetworkManagerImpl.java
	setup/db/create-schema.sql
	setup/db/db/schema-40to410.sql

Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-23 13:54:46 -08:00
Rohit Yadav 5d8e106602 api: Add method in ApiDispatcher to be reused for both UUID and List<Uuid>
Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-22 18:57:26 -08:00
Rohit Yadav 024f0d95dd api: Use Identity interface instead of java reflect to getId
- Add new interface method to getId
- Fix method definition in AsyncJob
- Get rid of mechanism to getId using reflect, use Identity interface

Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-21 19:05:45 -08:00
Rohit Yadav 03b47cb501 api: Temp. fix to be backward compatible to old way of id passing
For some apis, the param=-1 is used to evaluate conditionals. Allow -1 to be passed
for now. This is a APITODO/FIXME to fix stuff in service layer and then only get rid of it.

Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-21 14:41:14 -08:00
Min Chen a88ce6bb7f Remove IdentityProxy from CloudException and ExceptionResponse. 2012-12-19 23:49:44 -08:00
Rohit Yadav 7b6132e8e2 api: Skip empty uuid processing in ApiDispatcher for received params
Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-18 18:16:18 -08:00
Rohit Yadav 22ee4200c3 api: Fix findByXId to findByUuid in EntityManager and ApiDispatcher
Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-18 17:44:17 -08:00
Rohit Yadav 5fdce84e81 api: Process UUID and Parameter annotations in ApiDispatcher
- Use @Parameter's entityType and type annotation fields
- Use @Entity annotation in Reponse class to get table info for Dao
- Use findByXId to process all entities and translate UUID to ID
- Handle error in reflection method invoking

Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-18 04:16:33 -08:00
Rohit Yadav de8aa86542 api: Work in progress code in ApiDispatcher to process annotations
- All id params are now uuids, basically for documentation
- Use injections and not component locator
- Remove resourceType field checking, it's now called entityType
- Fix indents

Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-17 10:00:27 -08:00
Edison Su b70c1a5a84 Backs NFS-based secondary storage with an S3-compatible object store. Periodically, a reaper thread synchronizes templates and ISOs stored on a NFS secondary storage mount with a configured S3 object store. It also pushes snapshots to the object store when they are created and downloads them in other zones on-demand. In addition to permitting the use of commodity or IaaS storage solutions for static assets, it provides a means of automatically synchronizing template and ISO assets across multiple zones. 2012-12-13 23:18:37 -08:00
Rohit Yadav af28c06998 api: move and group all under command, org.apache.cloudstack.command.*
Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-07 18:30:54 -08:00
Min Chen eba353099e api_refactoring: Fix build issue with api_refactoring branch.
Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-06 15:00:48 -08:00
Rohit Yadav 7ac48798b4 api_refactor: refactor event apis
- Fix refactored apis, mappings in commands*.in
- Fix comments etc.

Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-04 00:05:54 -08:00
Rohit Yadav 6fc3bc3760 api_refactor: refactor vpn and vm apis
- Refactor VPN and VM APIs to admin and user pkgs
- Names space, org.apache.cloudstack
- Fix refactored apis in commands*.in
- Fix comments etc.
- Expand tabs, remove trailing whitespace

Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
2012-12-03 21:27:02 -08:00
Rohit Yadav 5edfc2760a refactor: remove redundant imports, fix trailing chars 2012-12-03 13:54:37 -08:00
Prachi Damle a2306f4917 some more poc work 2012-11-29 16:10:09 -08:00
Prachi Damle 073863249a Some ACL POC work
Conflicts:

	server/src/com/cloud/api/ApiDispatcher.java
2012-11-29 16:09:47 -08:00
Alena Prokharchyk 9d07ad8ecb CLOUDSTACK-304: default number of concurrent snapshots is NULL (unlimited) - to provide backwards compatibility for existing customers.
Conflicts:

	setup/db/db/schema-305to306.sql
2012-10-16 11:25:05 -07:00
Alena Prokharchyk 339aa41442 CLOUDSTACK-304: Synchronization support for createSnapshot command - don't sent more than "concurrent.snapshots.threshold.perhost" createSnapshots commands to the backend host.
Conflicts:

	core/src/com/cloud/async/AsyncJobVO.java
	core/src/com/cloud/async/SyncQueueVO.java
	server/src/com/cloud/api/ApiDispatcher.java
	server/src/com/cloud/api/ApiServer.java
	server/src/com/cloud/async/AsyncJobManagerImpl.java
	server/src/com/cloud/async/SyncQueueManager.java
	server/src/com/cloud/async/SyncQueueManagerImpl.java
	server/src/com/cloud/async/dao/SyncQueueDao.java
	server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
	server/test/com/cloud/async/TestSyncQueueManager.java
	setup/db/create-schema.sql
2012-10-10 13:40:00 -07:00
David Nalley e87558256c Patch from Chip Childers
https://reviews.apache.org/r/5704/
License header updates for the server folder
2012-07-02 09:51:21 -04:00
Alena Prokharchyk 03ccb7f313 CS-14512: fixed deployVm with ipToNetworkList when uuid is used for networkIds
Conflicts:

	server/src/com/cloud/api/ApiResponseHelper.java
2012-04-16 15:43:56 -07:00
frank 2f634c0913 Switch to Apache license 2012-04-03 04:50:05 -07:00
Vijayendra Bhamidipati 57c54e23d6 Bug 14060: Include a CloudStack error code in an Exception Response
Bug 13127: API error text refer to database ids instead of uuids

Code-Reviewers: Ewan Mellor, Kelven Yang

Description:

	1. A new class CSExceptionErrorCode has been added to utils.
	   It contains a list of error codes for each type of
	   Exception class. Use fully qualified package paths for
	   Exceptions in CSExceptionErrorCode.  We log any exception
	   name not found in the list of error codes for exceptions.

	2. Whenever we throw an exception exobj anywhere in the
	   CS code, the CSErrorCode is set in the base class
	   constructor.

	3. We add a new field csErrorCode in classes CloudException,
	   RuntimeCloudException, ExecutionException and
	   ExceptionResponse.

	4. Two places in ApiServer.java were wrongly modified when
	   putting in changes for bug 13127 to not throw an exception.
	   This has been corrected in this commit.
2012-03-05 17:39:09 -08:00
Vijayendra Bhamidipati 59631452b9 Bug 13127: API error text refer to database ids instead of uuids
Description:

	Modify Exception handling to enable addition of multiple
	uuids in a single exception thrown by API functions. Both
	XML and JSON outputs will store all uuids and Fieldnames.
	This will make it easier to provide more information when
	an exception occurs - for example, a zone id, a cluster id,
	host id, and then a specific property id.
2012-02-27 17:55:03 -08:00
Vijayendra Bhamidipati bfe1122bc6 Bug 13127: API error text refer to database ids instead of uuids
Description:

	Added a field name for the db id in the IdentityProxy class, and
	modified setProxyObject() to take an additional id name parameter.
	This will let us know the name of the uuid that we are returning.
	E.g.- domainId, zoneId, etc. The client can view this field in
	the json/xml output. Modified the JSON/XML serialization routines
	to append this new parameter to the serialized output for Exception
	Responses.
2012-02-27 17:55:01 -08:00
Vijayendra Bhamidipati c3fbe29cf8 Bug 13127: API error text refer to database ids instead of uuids
Description:

	1) Added a setProxyObject() method to CloudException and RuntimeCloudException
	2) Modified a bunch of throw exceptions in NetworkManagerImpl.java to call setProxyObject() before throwing an exception.
	3) Changed scope of ProxyIdentity attribute to protected.
	4) Added routines to ServerApiException to get/set IdentityProxy object, and
	   routine in RuntimeCloudException to get the Idproxy object.
	5) Modified the exception handling around the dispatcher and handlerequest()
	   to copy over the IdentityProxy information before rethrowing an exception
	   eventually back to handle().
	6) Removed duplicate IdentityProxy object in ServerApiException.
	   It was extending RuntimeCloudException which already had an
	   IdentityProxy object.
2012-02-27 17:54:56 -08:00
Alena Prokharchyk 294d3a2fda Code format fixes 2012-02-10 15:10:21 -08:00
Alena Prokharchyk 223497baa4 bug 12877: fixed pagesize=-1 behavior
status 12877: resolved fixed
2012-01-09 13:26:12 -08:00
Kelven Yang 85ad8ffca3 rename com.cloud.identity package to com.cloud.uuididentity as a previous deleted com.cloud.Identity name make git confused with com.cloud.identity under linux systems 2012-01-05 14:52:16 -08:00
Alena Prokharchyk bb2a8cf7ea NaaS: added "subdomainAccess" parameter to domain level network object. The parameter defines whether the network can be accessed from the subdomains. If the parameter is not specified, it would be defaulted to allow.subdomain.network.access Global Config param 2011-11-14 18:13:47 -08:00
Alex Huang f6fcaa49ec Merge complete except for virtualnetworkappliancemanager 2011-11-10 15:18:16 -08:00
Kelven Yang f5d56b3d5d Fix problems caused by merging 2011-11-03 10:35:25 -07:00
Kelven Yang 79e39c20fb Fixes on merged result 2011-11-03 07:34:01 -07:00
Kelven Yang 924e556c95 bug 6745: Using UUID instead of integers - for all commands 2011-11-03 07:34:00 -07:00
Kelven Yang 8d8775b533 bug 6745: Using UUID instead of integers - for Async Jobs 2011-11-03 07:33:58 -07:00
Kelven Yang fa2dd8e93a bug 6745: Using UUID instead of integers - for VM instances 2011-11-03 07:33:56 -07:00
kishan d55c827f00 bug 4844: Added length in API parameter annotation. Throw invalid param exception when value of param is greater than length. Default length is 255.
status 4844: resolved fixed
2011-10-27 12:46:01 +05:30
kishan ca4b1917dd Revert "bug 4844: Do not allow param values to be greater than length 256"
This reverts commit 7598ca07d3b3214e479886e3901df0f0db09f6f1.
2011-10-25 14:22:14 +05:30
kishan e130911371 bug 4844: Do not allow param values to be greater than length 256
status 4844: resolved fixed
2011-10-24 18:02:32 +05:30
prachi 8570b25506 NAAS: APIServer changes to introduce framework to read commands from pluggable components having separate commands.properties file
Changes:
- Added a new interface 'PluggableService'
- Any component that can be packaged separately from cloudstack, can implement this interface and provide its own property file listing the API commands the component supports
- As an example have made VirtualNetworkApplianceService pluggable and a new configureRouter command is added
- ComponentLocator reads all the pluggable service from componentLibrary or from components.xml and instantiates the services.
- As an example, DefaultComponentLibrary adds the pluggable service 'VirtualNetworkApplianceService'
- Also components.xml.in has an entry to show how a pluggable service can be added, but it is commented out.
- APIServer now reads the commands for each pluggable service and when a command for such a service is called, APIServer sets the required instance of the pluggable service in the coomand.
- To do this a new annotation '@PlugService' is added that is processed by APIServer. This eliminates the dependency on the BaseCmd to instantiate the service instances.
2011-10-11 17:34:57 -07:00
alena ccd47c1b21 Implemented Project Invitations 2011-09-26 17:47:20 -07:00
alena a1331d1cfc Intermidiate checkin to Project feature:
1) Introduce new managers - ProjectManager and DomainManager. Moved all domain related code from AccountManager to DomainManager.
2) Moved some code from ManagementServerImpl to the correct managers.
3) New resource limit for Domain - Project
2011-09-20 18:35:28 -07:00
kishan 695abd5c5a bug 7826: Check for correct date range. Make DateFormat strict (turn off lenient)
status 7826: resolved fixed
2011-08-05 19:44:44 +05:30
nit 6256c88be6 bug 9724 : ListEvents API - add granularity till the hours, minutes and seconds level. The new format that startDate and endDate expect are yyyy-MM-dd HH:mm:ss. To honour backward compatibility these parameters can also be in the old format yyyy-MM-dd. I have added this to the parameter documentation. Also changed is the log message for throwing error in case of parsing exception.
status 9724: resolved fixed
2011-05-26 21:21:28 +05:30
alena 996d0edbc9 Throw server api exception with correct error code 2011-04-18 16:59:55 -07:00
alena ec76406942 bug 8737: set entityOwnerId for all api commands including non-Async ones
status 8737: resolved fixed
2011-02-28 09:21:05 -08:00
alena 6f55c4dd7e bug 8270: Synchronize on 1) ipAddress object when create/delete ipForwarding/portForwardingRule and vpn service 2) on networkId when assignTo/removeFrom/deleteLoadBalancer
status 8270: resolved fixed
2011-02-03 18:45:49 -08:00
kishan 94ec7bf27a bug 7842: events refactoring. Still wrok in progress 2011-01-20 21:49:50 +05:30
kishan 03a66d4b90 bug 7842: events refactoring 2011-01-14 18:55:54 +05:30
abhishek 7c2fffe67a bug 7989: fixing this regression
status 7989: resolved fixed
2011-01-13 17:07:03 -08:00
kishan 388e689755 bug 7842: Move events to service layer from http api 2011-01-14 03:58:56 +05:30
alena 133f286b06 Fixed description for ServerApiException 2010-12-29 09:55:21 -08:00
Alex Huang 544fa7ff1b remote access vpn, user ip address changes 2010-12-29 09:32:54 -08:00
alena 7b3b9076b0 bug 6168: throw a runtime exception when unable to schedule Async job instead of returning jobId=0L
status 6168: resolved fixed
2010-12-27 17:00:29 -08:00
kishan bb0e6a0ae3 bug 7504: Events refactoring 2010-12-24 12:58:32 +05:30
alena 7e9579dab2 Fixed create/list LoadBalancerRules 2010-12-09 21:06:48 -08:00
Alex Huang 98eb58bf84 callCreate to create 2010-12-04 17:58:16 -08:00
alena 9f11f52611 listNetworks - don't return Networks created from systemOnly network offerings 2010-12-03 12:31:30 -08:00
alena f8a687ab23 1) Implemented create/list/deleteNetworkOffering create/delete/listNetwork APIs.
2) Added networkIds parameter to deployVMCmd - accepts list of networks ids separated by coma.
3) Changed domainRouter/systemVm/userVm response to return list of Nics associated with the vm.
2010-12-02 19:30:17 -08:00
alena 680812f675 bug 7223: page and pagesize parameters must be specified together "list" api commands
status 7223: resolved fixed
2010-11-30 11:31:34 -08:00
alena a646745516 bug 7227: applying Alex's fix - different way of desirializing List objects.
status 7227: resolved fixed
2010-11-22 14:08:43 -08:00
alena cdea2d210d Better logging for api exceptions. 2010-11-22 11:27:15 -08:00
alena cec8ebd5cd bug 7236: don't catch AsyncCommandQueued exception in ApiDispatcher
status 7236: resolved fixed
2010-11-19 18:40:32 -08:00
alena a5dfaaf31b API exception handling - print api command name to the log. 2010-11-19 15:48:58 -08:00
alena 8362d0feba Reverting back commit e5c137e303 as it wasn't meant to be in 2.2 RC1. 2010-11-19 14:23:39 -08:00
alena e5c137e303 bug 7223: pagesize and page should be specified together in "list" api commands
status 7223: resolved fixed
2010-11-19 14:03:44 -08:00
alena c5d78a726e Modified exception handing in API. Following exceptions are supported now (location - BaseCmd.java):
* MALFORMED_PARAMETER_ERROR - when type of the request parameter is invalid (String instead of Long for id for example)
* PARAM_ERROR - when invalid parameter value is specified in api request. For example, id of non existing vm for StartVmCmd
* ACCOUNT_RESOURCE_LIMIT_ERROR - when user tries to exceed his resource limits by executing the api command.
* INSUFFICIENT_CAPACITY_ERROR - when resource fails to create/start due to insufficient capacity.
* RESOURCE_UNAVAILABLE_ERROR - when user tries to create a vm when storage is not available.
* RESOURCE_IN_USE_ERROR - when user tries to delete/modify resource while it's in use. For example, when we try to delete a network group when it contains ingress rules.
* NETWORK_RULE_CONFLICT_ERROR - when LB/PF rule to add conflicts with existing rule
* ACCOUNT_ERROR - when user is not authorized to execute operation on the resource.
* INTERNAL_ERROR
2010-11-16 11:56:34 -08:00
alena d43a8e983c Fixed authorizeNetworkGroupIngress api command (it stopped working after API refactor) 2010-11-15 17:44:51 -08:00
alena 5fafef9970 More api refactor - build api response is execute() method instead of getResponse method. 2010-11-09 09:58:05 -08:00
alena 1c24deda34 1) Refactored current Apis not to use reflection for method invocation. In new version following has to be done:
* Implement callCreate() and execute() methods in apis extending BaseAsyncCreateCmd (example - CreateVolumeCmd)
* Implement execute() method in apis extending BaseCmd and BaseAsyncCmd (example - deleteVolumeCmd and deleteUserCmd)

We no longer need createMethod(), method(), manager() fields in @Implementation annotation, cleanup has to be done.

2) Moved Account/User related methods to AccountManagerImpl. Methods are exposed via AccountService interface.
3) Enhanced exception handing for Api calls.
4) Created ConfigurationService interface, all Api config methods are exposed via it.
2010-11-08 11:27:36 -08:00
Kris McQueen a9349cb815 bug 6857: if the dispatcher recieves an IllegalArgumentException, bubble that up to the response so the caller gets a useful message 2010-10-29 14:07:23 -07:00
Kris McQueen 642b8a56f4 If the create command returns null for whatever reason, throw an exception so it aborts scheduling the async job to act on the created object 2010-10-28 17:52:37 -07:00
Kris McQueen 9056653e17 Change the API Implementation annotation to use the manager's class rather than an enum. This allows methods for new managers to be added trivially rather than having to modify the dispatcher to load a new manager class. 2010-10-27 12:23:31 -07:00
Kris McQueen 95da86ef1a bug 6733: re-throw ServerApiExceptions when dispatching API commands rather than logging them and throwing a generic INTERNAL_ERROR exception
status 6733: resolved fixed
2010-10-26 16:54:42 -07:00
abhishek c6588c0e25 adding some error return handling to api dispatcher, and cleaning up some of the code paths to return the right error messages 2010-10-26 14:27:26 -07:00
Jessica Wang 958aaaaf87 new UI - instance page - refactor submenu. 2010-10-22 20:23:05 -07:00
Alex Huang 25e4ed6997 more changes in the api 2010-10-21 16:53:42 -07:00
Alex Huang d5d8f27cad Added more changes to the api 2010-10-21 15:11:49 -07:00
abhishek 7c11c04427 reverting the change for bug 6361; this was an accidental push instead of commit 2010-10-19 15:21:01 -07:00
abhishek 523862f571 bug 6361: further name changes from network to security group 2010-10-19 14:35:17 -07:00
Kris McQueen 8e086d7a21 resolving merge conflicts between 2.1.refactor and master 2010-10-12 16:28:16 -07:00
Kris McQueen 9c593352d0 Fixing events for async jobs so that there's a scheduled event recorded with appropriate type/description whenever the API framework schedules the async command to run. A few miscellaneous fixes as well uncovered during regression testing (router response was not parsed correctly by UI, etc.) 2010-10-05 20:26:18 -07:00
Kris McQueen 41a16a478a Fixes required for regressions found running automated tests. (1) method signatures that weren't properly refactored to new API framework (2) API request parameter types should always be specified lest they default to String which may or may not be desired (3) better exception handling with regard to Queued commands and generic exceptions (4) fix eventing to pass the proper accountId where neccessary 2010-10-01 14:11:18 -07:00
Kris McQueen 62257d4021 Fix serializing async job responses by writing a custom adapter for ResponseObjects. Improve exception handling when calling async commands (the job still needs to complete, but with FAILED status). 2010-09-24 13:52:35 -07:00
Kris McQueen c26426c7c7 Throw an exception when the dispatcher can't find the implementation for an API command. 2010-09-21 18:26:57 -07:00
Kris McQueen 12ef5106b6 Fixing serialization of JSON responses to handle both regular objects and list-style responses. Add missing managers to API dispatcher. Fix a typo in listAlerts command implementation method. Add signatures for various add host/storage APIs. 2010-09-20 15:20:32 -07:00
Kris McQueen 4a73639d67 Fix up setting the response object correctly after dispatching the api method call. Begin working on the serialization of the responses which don't include the command name just yet, that's coming. 2010-09-17 14:56:55 -07:00
Kris McQueen 3f6a438d92 Refactoring the AsyncJobManager to queue jobs appropriately if there is a need to synchronize execution on an object, e.g. a router. API developers can now call command.synchronizeCommand(String, Long) to force the command to be synchronized on a particular object type [the string arg] with a particular id [the long arg]. When synchronizeCommand() is invoked, an exception maybe thrown by the framework (AsyncCommandQueued exception) to force the business logic to abort. The command will then be queued and invoked at the appropriate time. The synchronizeCommand() is re-entrant and will be a no-op if the command has already been queued and is now ready for execution. 2010-09-16 19:05:06 -07:00
Kris McQueen dbb2897626 Unexposed parameters can now be assigned to commands. This are for internal use of the command, and will be serialized/deserialized during execution/response phases, but will not be accepted as part of the API request. Also create a DB utility file for the API to use which delegates requests to the DAOs. Mostly this utility class will look up objects by ID, and it allows the removal of similar methods from ManagementServer, thereby reducing some of the clutter in ManagementServer. 2010-09-14 14:54:04 -07:00
Kris McQueen f4caf145c3 Refactoring dispatching API commands from the scheduled async job. Instead of calling an executor, the dispatcher invokes the method on the manager directly. After the command is executed the response is serialized to the async job table so it can be queried later. Also serialize a response for async create commands that includes the id of the object being created. 2010-09-13 18:28:19 -07:00
Kris McQueen da03aee028 Add snapshot manager to the list of managers that can be invoked through the API. This prepares the way for refactoring createSnapshot, but since the method is an async create that also needs to create a policy first and generally does not follow any other patters, I'll do this one last. 2010-08-18 19:08:23 -07:00
Kris McQueen 21ab91dc2c refactoring CreateNetworkGroup API command to new API framework 2010-08-17 19:07:00 -07:00
Kris McQueen 96f76062f9 Moving createDiskOffering to configurationManager, make AssignToLoadBalancer async 2010-08-11 19:32:09 -07:00
Manuel Amador (Rudd-O) ac730ec496 Branch 2.1.refactor committed 2010-08-11 09:13:42 -07:00