95 lines
2.7 KiB
C
95 lines
2.7 KiB
C
|
//
|
||
|
// Copyright (C) 2022 The Android Open Source Project
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <memory>
|
||
|
#include <optional>
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
|
||
|
#include <android-base/file.h>
|
||
|
#include <android-base/result.h>
|
||
|
|
||
|
#include "common/libs/utils/subprocess.h"
|
||
|
#include "host/commands/test_gce_driver/gce_api.h"
|
||
|
#include "host/commands/test_gce_driver/key_pair.h"
|
||
|
|
||
|
namespace cuttlefish {
|
||
|
|
||
|
// TODO(schuffelen): Implement this with libssh2
|
||
|
class SshCommand {
|
||
|
public:
|
||
|
SshCommand() = default;
|
||
|
|
||
|
SshCommand& PrivKey(const std::string& path) &;
|
||
|
SshCommand PrivKey(const std::string& path) &&;
|
||
|
|
||
|
SshCommand& WithoutKnownHosts() &;
|
||
|
SshCommand WithoutKnownHosts() &&;
|
||
|
|
||
|
SshCommand& Username(const std::string& username) &;
|
||
|
SshCommand Username(const std::string& username) &&;
|
||
|
|
||
|
SshCommand& Host(const std::string& host) &;
|
||
|
SshCommand Host(const std::string& host) &&;
|
||
|
|
||
|
SshCommand& RemotePortForward(uint16_t remote, uint16_t local) &;
|
||
|
SshCommand RemotePortForward(uint16_t remote, uint16_t local) &&;
|
||
|
|
||
|
SshCommand& RemoteParameter(const std::string& param) &;
|
||
|
SshCommand RemoteParameter(const std::string& param) &&;
|
||
|
|
||
|
Command Build() const;
|
||
|
|
||
|
private:
|
||
|
struct RemotePortForwardType {
|
||
|
uint16_t remote_port;
|
||
|
uint16_t local_port;
|
||
|
};
|
||
|
|
||
|
std::optional<std::string> privkey_path_;
|
||
|
bool without_known_hosts_;
|
||
|
std::optional<std::string> username_;
|
||
|
std::optional<std::string> host_;
|
||
|
std::vector<RemotePortForwardType> remote_port_forwards_;
|
||
|
std::vector<std::string> parameters_;
|
||
|
};
|
||
|
|
||
|
class ScopedGceInstance {
|
||
|
public:
|
||
|
static android::base::Result<std::unique_ptr<ScopedGceInstance>>
|
||
|
CreateDefault(GceApi& gce, const std::string& zone,
|
||
|
const std::string& instance_name, bool internal_addresses);
|
||
|
~ScopedGceInstance();
|
||
|
|
||
|
android::base::Result<SshCommand> Ssh();
|
||
|
android::base::Result<void> Reset();
|
||
|
|
||
|
private:
|
||
|
ScopedGceInstance(GceApi& gce, const GceInstanceInfo& instance,
|
||
|
std::unique_ptr<TemporaryFile> privkey,
|
||
|
bool internal_addresses);
|
||
|
|
||
|
android::base::Result<void> EnforceSshReady();
|
||
|
|
||
|
GceApi& gce_;
|
||
|
GceInstanceInfo instance_;
|
||
|
std::unique_ptr<TemporaryFile> privkey_;
|
||
|
bool use_internal_address_;
|
||
|
};
|
||
|
|
||
|
} // namespace cuttlefish
|