class PodPushClientImpl implements PodPushClient {

    @Override
    public PodWatcher start(PodConfig podConfig, ExecutionConfig executionConfig,
        CountDownLatch podScheduled, CountDownLatch podFinishedSuccessOrFailure)
    {
        if (podConfig == null || executionConfig == null)
        {
            throw new IllegalArgumentException("Must provide configuration details for Pod creation.");
        }
        else if (podConfig.getImageName() == null)
        {
            throw new IllegalArgumentException("Must provide podConfig.imageName.");
        }
        
        Pod podToCreate = Fabric8Helper.getPodSpec(kubeConfig, podConfig, executionConfig);

        String podName = podToCreate.getMetadata().getName();

        if (executionConfig.getLogLineAccumulator() == null)
            executionConfig.setLogLineAccumulator(new LogLineAccumulatorImpl(podName));

        if(!podConfig.isEndOfLogIdentifierEmpty())
        {
            executionConfig.getLogLineAccumulator().setCompletionIdentifier(podConfig.getEndOfLogIdentifier());
        }

        // log watching (PodWatcherImpl establishes this) via log watch client
        PodWatcherImpl podWatcherImpl = podWatcherFactory.createPodWatcher(
            kubernetesHttpClients.getLogWatchClient(),
            podScheduled,
            podFinishedSuccessOrFailure,
            kubeConfig.getNameSpace(),
            podName,
            executionConfig.getLogLineAccumulator()
        );
        // pod watching (PodWatcherImpl.eventReceived) via pod watch client
        Watch watch = initializePodWatcher(podName, podWatcherImpl);
        podWatcherImpl.setWatch(watch);
        logPodSpecs(startPod(podToCreate), START_POD_TEMPLATE);
        return podWatcherImpl;
    }

}