The managed cloud provider is a provider extension to the
DockerParallel
package. It aims to provide container
management tools for the non-kubernetes cloud provider. The cloud
provider only needs to define functions to run and stop the worker. The
managed cloud provider can automatically scale the number of workers up
or down according to the user’s request. Below shows the structure of
the managed cloud provider
where CloudProvider
is the base class defined in
DockerParallel
package. CloudProvider
dose
nothing but define a few generics(the virtual class in C++ language)
.ManagedCloudProvider
inherits from
CloudProvider
, it takes over the control of the worker
container by defining the method for setDockerWorkerNumber
and getDockerWorkerNumbers
(The red font). The provider who
inherits from ManagedCloudProvider
does not need to manage
the workers itself, it only needs to define the method for the generics
exposed by ManagedCloudProvider
, namely
The name should be self-explained. Please note that only
runDockerWorkerContainers
,
getDockerWorkerStatus
and
killDockerWorkerContainers
are required for making the
provider works. The rest are optional and have the default methods(based
on getDockerWorkerStatus
).
runDockerWorkerContainers
should deploy the worker on
the cloud. The generic for runDockerWorkerContainers
is
getGeneric("runDockerWorkerContainers")
#> nonstandardGenericFunction for "runDockerWorkerContainers" defined from package "ManagedCloudProvider"
#>
#> function (provider, cluster, container, hardware, workerNumber,
#> verbose)
#> {
#> standardGeneric("runDockerWorkerContainers")
#> }
#> <bytecode: 0x000002161f812670>
#> <environment: 0x000002161f943478>
#> Methods may be defined for arguments: provider
#> Use showMethods(runDockerWorkerContainers) for currently available ones.
where provider
is the cloud provider object and
cluster
is the DockerCluster
object,
container
specifies which container should be used for the
worker, hardware
indicates the hardware requirement for
each worker, workerNumber
is the number of the workers that
should be deployed. verbose
is the verbose level. The
return value of the function should be a character vector of length
workerNumber
with each element corresponding to a handle of
a worker. The handle should be used to manage the lifecycle of the
workers. It is possible to return the same handle for multiple workers
if they share the same lifecycle(e.g. multiple workers share the same
container).
getDockerWorkerStatus
is for checking the status of the
workers, a worker can have three possible status, namely
initializing
, running
and
stopped
. The generic for getDockerWorkerStatus
is
getGeneric("getDockerWorkerStatus")
#> nonstandardGenericFunction for "getDockerWorkerStatus" defined from package "ManagedCloudProvider"
#>
#> function (provider, cluster, workerHandles, verbose)
#> {
#> standardGeneric("getDockerWorkerStatus")
#> }
#> <bytecode: 0x0000021629794980>
#> <environment: 0x0000021629777048>
#> Methods may be defined for arguments: provider
#> Use showMethods(getDockerWorkerStatus) for currently available ones.
where workerHandles
is a vector of handles returned by
runDockerWorkerContainers
, the elements of
workerHandles
are unique. The return value should be a
character vector indicating the status of each worker.
The generics IsDockerWorkerInitializing
,
IsDockerWorkerRunning
and
IsDockerWorkerStopped
check whether the worker is in a
specific status. Once you have getDockerWorkerStatus
defined these methods are automatically available. Therefore, you do not
have to define them unless you have any faster implementation.
killDockerWorkerContainers
will kill the workers given
the worker handles. If a handle is shared by multiple workers, all
workers with the same handle should be killed. The generic is
getGeneric("killDockerWorkerContainers")
#> nonstandardGenericFunction for "killDockerWorkerContainers" defined from package "ManagedCloudProvider"
#>
#> function (provider, cluster, workerHandles, verbose)
#> {
#> standardGeneric("killDockerWorkerContainers")
#> }
#> <bytecode: 0x000002161fc45950>
#> <environment: 0x000002161fc7bd10>
#> Methods may be defined for arguments: provider
#> Use showMethods(killDockerWorkerContainers) for currently available ones.
The return value is a logical vector indicating whether the killing process is successful. Please note that the method should accept the invalid handle. That is, if the worker has already been killed or the handle does not exist, the method should not raise any error and the killing action should be denoted as successful.