iSulad/src/services/cri/cri_runtime_service.h
LiFeng e2728aa73e iSulad: internal change
Signed-off-by: LiFeng <lifeng68@huawei.com>
2020-01-06 05:11:01 -05:00

285 lines
16 KiB
C++

/******************************************************************************
* Copyright (c) Huawei Technologies Co., Ltd. 2017-2019. All rights reserved.
* iSulad licensed under the Mulan PSL v1.
* You can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v1 for more details.
* Author: tanyifeng
* Create: 2017-11-22
* Description: provide cri runtime service function definition
**********************************************************************************/
#ifndef _CRI_RUNTIME_SERVICES_IMPL_H_
#define _CRI_RUNTIME_SERVICES_IMPL_H_
#include <string>
#include <map>
#include <vector>
#include <memory>
#include <pthread.h>
#include "checkpoint_handler.h"
#include "network_plugin.h"
#include "cri_services.h"
#include "callback.h"
#include "container_inspect.h"
#include "host_config.h"
#include "container_custom_config.h"
#include "errors.h"
#include "cri_image_service.h"
#include "cri_pod_network.h"
namespace CRIRuntimeService {
class Constants {
public:
static std::string namespaceModeHost;
// sandboxname default values
static std::string nameDelimiter;
static char nameDelimiterChar;
static std::string kubePrefix;
static std::string sandboxContainerName;
static std::string kubeAPIVersion;
static std::string iSulaRuntimeName;
static constexpr int64_t DefaultMemorySwap { 0 };
static constexpr int64_t DefaultSandboxCPUshares { 2 };
static constexpr int64_t PodInfraOOMAdj { -998 };
// container mounts files
static std::string RESOLV_CONF_PATH;
static constexpr int MAX_DNS_SEARCHES { 6 };
};
} // namespace CRIRuntimeService
class CRIRuntimeServiceImpl : public cri::RuntimeManager,
public cri::RuntimeVersioner,
public cri::PodSandboxManager,
public cri::ContainerManager {
public:
CRIRuntimeServiceImpl();
CRIRuntimeServiceImpl(const CRIRuntimeServiceImpl &) = delete;
CRIRuntimeServiceImpl &operator=(const CRIRuntimeServiceImpl &) = delete;
virtual ~CRIRuntimeServiceImpl() = default;
void Init(Network::NetworkPluginConf mConf, const std::string &podSandboxImage, Errors &err);
std::string GetRealContainerOrSandboxID(const std::string &id, bool isSandbox, Errors &error);
container_inspect *InspectContainer(const std::string &containerID, Errors &err);
std::string GetNetNS(const std::string &podSandboxID, Errors &err);
void Version(const std::string &apiVersion, runtime::v1alpha2::VersionResponse *versionResponse,
Errors &error) override;
void UpdateRuntimeConfig(const runtime::v1alpha2::RuntimeConfig &config, Errors &error) override;
std::unique_ptr<runtime::v1alpha2::RuntimeStatus> Status(Errors &error) override;
std::string RunPodSandbox(const runtime::v1alpha2::PodSandboxConfig &config, Errors &error) override;
void StopPodSandbox(const std::string &podSandboxID, Errors &error) override;
void RemovePodSandbox(const std::string &podSandboxID, Errors &error) override;
std::unique_ptr<runtime::v1alpha2::PodSandboxStatus> PodSandboxStatus(const std::string &podSandboxID,
Errors &error) override;
void ListPodSandbox(const runtime::v1alpha2::PodSandboxFilter *filter,
std::vector<std::unique_ptr<runtime::v1alpha2::PodSandbox>> *pods, Errors &error) override;
void PortForward(const runtime::v1alpha2::PortForwardRequest &req, runtime::v1alpha2::PortForwardResponse *resp,
Errors &error) override;
std::string CreateContainer(const std::string &podSandboxID,
const runtime::v1alpha2::ContainerConfig &containerConfig,
const runtime::v1alpha2::PodSandboxConfig &podSandboxConfig, Errors &error) override;
void StartContainer(const std::string &containerID, Errors &error) override;
void StopContainer(const std::string &containerID, int64_t timeout, Errors &error) override;
void RemoveContainer(const std::string &containerID, Errors &error) override;
void ListContainers(const runtime::v1alpha2::ContainerFilter *filter,
std::vector<std::unique_ptr<runtime::v1alpha2::Container>> *containers, Errors &error) override;
void ListContainerStats(const runtime::v1alpha2::ContainerStatsFilter *filter,
std::vector<std::unique_ptr<runtime::v1alpha2::ContainerStats>> *containerstats,
Errors &error) override;
std::unique_ptr<runtime::v1alpha2::ContainerStatus> ContainerStatus(const std::string &containerID,
Errors &error) override;
void UpdateContainerResources(const std::string &containerID,
const runtime::v1alpha2::LinuxContainerResources &resources, Errors &error) override;
void ExecSync(const std::string &containerID, const google::protobuf::RepeatedPtrField<std::string> &cmd,
int64_t timeout, runtime::v1alpha2::ExecSyncResponse *reply, Errors &error) override;
void Exec(const runtime::v1alpha2::ExecRequest &req, runtime::v1alpha2::ExecResponse *resp, Errors &error) override;
void Attach(const runtime::v1alpha2::AttachRequest &req, runtime::v1alpha2::AttachResponse *resp,
Errors &error) override;
private:
void VersionResponseToGRPC(container_version_response *response, runtime::v1alpha2::VersionResponse *gResponse,
Errors &error);
bool IsDefaultNetworkPlane(cri_pod_network_element *network);
void SetSandboxStatusNetwork(container_inspect *inspect, const std::string &podSandboxID,
std::unique_ptr<runtime::v1alpha2::PodSandboxStatus> &podStatus, Errors &error);
void PodSandboxStatusToGRPC(container_inspect *inspect, const std::string &podSandboxID,
std::unique_ptr<runtime::v1alpha2::PodSandboxStatus> &podStatus, Errors &error);
void ListPodSandboxToGRPC(container_list_response *response,
std::vector<std::unique_ptr<runtime::v1alpha2::PodSandbox>> *pods,
bool filterOutReadySandboxes, Errors &error);
void ListContainersToGRPC(container_list_response *response,
std::vector<std::unique_ptr<runtime::v1alpha2::Container>> *pods, Errors &error);
void PackContainerStatsAttributes(const char *id, std::unique_ptr<runtime::v1alpha2::ContainerStats> &container,
Errors &error);
void PackContainerStatsFilesystemUsage(const char *id, const char *image_type,
std::unique_ptr<runtime::v1alpha2::ContainerStats> &container,
Errors &error);
void ContainerStatsToGRPC(container_stats_response *response,
std::vector<std::unique_ptr<runtime::v1alpha2::ContainerStats>> *pods, Errors &error);
void ContainerStatusToGRPC(container_inspect *inspect,
std::unique_ptr<runtime::v1alpha2::ContainerStatus> &contStatus, Errors &error);
void ExecSyncFromGRPC(const std::string &containerID, const google::protobuf::RepeatedPtrField<std::string> &cmd,
int64_t timeout, container_exec_request **request, Errors &error);
void ListContainersFromGRPC(const runtime::v1alpha2::ContainerFilter *filter, container_list_request **request,
Errors &error);
void ListPodSandboxFromGRPC(const runtime::v1alpha2::PodSandboxFilter *filter, container_list_request **request,
bool *filterOutReadySandboxes, Errors &error);
void ApplySandboxResources(const runtime::v1alpha2::LinuxPodSandboxConfig *lc, host_config *hc, Errors &error);
void ApplySandboxLinuxOptions(const runtime::v1alpha2::LinuxPodSandboxConfig &lc, host_config *hc,
container_custom_config *custom_config, Errors &error);
void MakeSandboxIsuladConfig(const runtime::v1alpha2::PodSandboxConfig &c, host_config *hc,
container_custom_config *custom_config, Errors &error);
void MakeContainerConfig(const runtime::v1alpha2::ContainerConfig &config, container_custom_config *cConfig,
Errors &error);
void GetContainerLogPath(const std::string &containerID, char **path, char **realPath, Errors &error);
void CreateContainerLogSymlink(const std::string &containerID, Errors &error);
void RemoveContainerLogSymlink(const std::string &containerID, Errors &error);
std::string MakeSandboxName(const runtime::v1alpha2::PodSandboxMetadata &metadata);
std::string MakeContainerName(const runtime::v1alpha2::PodSandboxConfig &s,
const runtime::v1alpha2::ContainerConfig &c);
void modifyContainerNamespaceOptions(bool hasOpts, const runtime::v1alpha2::NamespaceOption &nsOpts, const char *ID,
host_config *hconf, Errors &err);
runtime::v1alpha2::NamespaceMode SharesHostNetwork(container_inspect *inspect);
runtime::v1alpha2::NamespaceMode SharesHostPid(container_inspect *inspect);
runtime::v1alpha2::NamespaceMode SharesHostIpc(container_inspect *inspect);
void GetContainerTimeStamps(container_inspect *inspect, int64_t *createdAt, int64_t *startedAt, int64_t *finishedAt,
Errors &err);
int ValidateExecRequest(const runtime::v1alpha2::ExecRequest &req, Errors &error);
std::string BuildURL(const std::string &method, const std::string &token);
int ValidateAttachRequest(const runtime::v1alpha2::AttachRequest &req, Errors &error);
std::string ParseCheckpointProtocol(runtime::v1alpha2::Protocol protocol);
void ConstructPodSandboxCheckpoint(const runtime::v1alpha2::PodSandboxConfig &config,
cri::PodSandboxCheckpoint &checkpoint);
std::string GetIP(const std::string &podSandboxID, container_inspect *inspect, const std::string &networkInterface,
Errors &error);
std::string GetIPFromPlugin(container_inspect *inspect, std::string networkInterface, Errors &error);
bool GetNetworkReady(const std::string &podSandboxID, Errors &error);
void SetNetworkReady(const std::string &podSandboxID, bool ready, Errors &error);
void ClearNetworkReady(const std::string &podSandboxID);
bool EnsureSandboxImageExists(const std::string &image, Errors &error);
void StopContainerHelper(const std::string &containerID, Errors &error);
void SetupSandboxFiles(const std::string &podID, const runtime::v1alpha2::PodSandboxConfig &config, Errors &error);
container_create_request *
GenerateCreateContainerRequest(const std::string &realPodSandboxID,
const runtime::v1alpha2::ContainerConfig &containerConfig,
const runtime::v1alpha2::PodSandboxConfig &podSandboxConfig, Errors &error);
host_config *GenerateCreateContainerHostConfig(const runtime::v1alpha2::ContainerConfig &containerConfig,
Errors &error);
int PackCreateContainerHostConfigSecurityContext(const runtime::v1alpha2::ContainerConfig &containerConfig,
host_config *hostconfig, Errors &error);
int PackCreateContainerHostConfigDevices(const runtime::v1alpha2::ContainerConfig &containerConfig,
host_config *hostconfig, Errors &error);
container_custom_config *
GenerateCreateContainerCustomConfig(const std::string &realPodSandboxID,
const runtime::v1alpha2::ContainerConfig &containerConfig,
const runtime::v1alpha2::PodSandboxConfig &podSandboxConfig, Errors &error);
int PackContainerImageToStatus(container_inspect *inspect,
std::unique_ptr<runtime::v1alpha2::ContainerStatus> &contStatus, Errors &error);
void UpdateBaseStatusFromInspect(container_inspect *inspect, int64_t &createdAt, int64_t &startedAt,
int64_t &finishedAt,
std::unique_ptr<runtime::v1alpha2::ContainerStatus> &contStatus);
void PackLabelsToStatus(container_inspect *inspect,
std::unique_ptr<runtime::v1alpha2::ContainerStatus> &contStatus);
void ConvertMountsToStatus(container_inspect *inspect,
std::unique_ptr<runtime::v1alpha2::ContainerStatus> &contStatus);
void SetupSandboxNetwork(const runtime::v1alpha2::PodSandboxConfig &config, const std::string &response_id,
const std::string &jsonCheckpoint, Errors &error);
void SetupUserDefinedNetworkPlane(const runtime::v1alpha2::PodSandboxConfig &config, const std::string &response_id,
container_inspect *inspect_data, std::map<std::string, std::string> &stdAnnos,
Errors &error);
void StartSandboxContainer(const std::string &response_id, Errors &error);
std::string CreateSandboxContainer(const runtime::v1alpha2::PodSandboxConfig &config, const std::string &image,
std::string &jsonCheckpoint, Errors &error);
container_create_request *GenerateSandboxCreateContainerRequest(const runtime::v1alpha2::PodSandboxConfig &config,
const std::string &image,
std::string &jsonCheckpoint, Errors &error);
container_create_request *PackCreateContainerRequest(const runtime::v1alpha2::PodSandboxConfig &config,
const std::string &image, host_config *hostconfig,
container_custom_config *custom_config, Errors &error);
int GetRealSandboxIDToStop(const std::string &podSandboxID, bool &hostNetwork, std::string &name, std::string &ns,
std::string &realSandboxID, std::map<std::string, std::string> &stdAnnos, Errors &error);
int StopAllContainersInSandbox(const std::string &realSandboxID, Errors &error);
int TearDownPodCniNetwork(const std::string &realSandboxID, std::vector<std::string> &errlist,
std::map<std::string, std::string> &stdAnnos, const std::string &ns,
const std::string &name, Errors &error);
int ClearCniNetwork(const std::string &realSandboxID, bool hostNetwork, const std::string &ns,
const std::string &name, std::vector<std::string> &errlist,
std::map<std::string, std::string> &stdAnnos, Errors &error);
int RemoveAllContainersInSandbox(const std::string &realSandboxID, std::vector<std::string> &errors);
int DoRemovePodSandbox(const std::string &realSandboxID, std::vector<std::string> &errors);
void MergeSecurityContextToHostConfig(const runtime::v1alpha2::PodSandboxConfig &c,
host_config *hc, Errors &error);
int PackContainerStatsFilter(const runtime::v1alpha2::ContainerStatsFilter *filter,
container_stats_request *request, Errors &error);
private:
service_callback_t *m_cb { nullptr };
std::shared_ptr<Network::PluginManager> m_pluginManager { nullptr };
std::map<std::string, bool> m_networkReady;
pthread_mutex_t m_networkReadyLock = PTHREAD_MUTEX_INITIALIZER;
CRIImageServiceImpl rImageService;
std::string m_podSandboxImage;
};
#endif /* _CRI_RUNTIME_SERVICES_IMPL_H_ */