import { IAuditable, IBetterLogger } from "@codiac.io/codiac-common";
import { AtLeast } from "@codiac.io/codiac-common/contracts";
import { UserNameTenantCode } from "@codiac.io/codiac-ops-common";
import { IOutputStyler, IUserInputProvider } from "../../ops";
import { ClusterDef, ImageRegistry, IngressDef } from "../../apis/codiac-api/contracts";
import * as api from "../../apis/codiac-api/contracts";
import * as sdk from "../../sdk";
import { RelayClient as GenRelayClient } from "../../apis/codiac-relay";
import { AwsSecretStoreDef, SecretStoreDef } from "../../relay/contracts";
import { AwsIdentity, CspPrimaryCredsMeta, LogintoCloudProviderRequest } from "../../apis/codiac-relay/contracts";
import { FileStoreDef } from "../../apis/codiac-api/contracts";
import { ClusterCaptureDef } from "../../codiac-entities/cluster-capture-def";
import { ICspAccountFilter, ICspLoginOptions } from "../../sdk";
export type AwsProprietaryInput = {
    sessionToken?: string | undefined;
};
/** Walks the user through the selection of an existing
 * or the declaration of a new image registry.
 */
export declare class AwsResourceConfigurator implements sdk.IFileStoreConfigurator, sdk.IRegistryConfigurator, sdk.ILoginConfigurator, sdk.ISecretStoreConfigurator, sdk.IClusterConfigurator {
    private genRelayClient;
    private codiacUser;
    private _ui;
    private _styler;
    private logger;
    constructor(genRelayClient: GenRelayClient, codiacUser: UserNameTenantCode, _ui: IUserInputProvider, _styler: IOutputStyler, logger: IBetterLogger);
    readonly cloudProvider: "aws";
    captureSecretStore(defaults?: Partial<AwsSecretStoreDef> | undefined): Promise<SecretStoreDef>;
    /** Concatenates the secret and session token into a single parseable base64 string */
    private crunchForTransport;
    promptToLogin(options?: ICspLoginOptions): Promise<[boolean, CspPrimaryCredsMeta]>;
    promptToLogout(accountFilter?: ICspAccountFilter): Promise<[boolean, string]>;
    assembleLoginRequest(userName: string | undefined, secret: string, providerAccountId?: string | undefined, proprietaryInput?: {
        [key: string]: any;
    } | undefined): LogintoCloudProviderRequest;
    /** Returns undefined for invalid creds. */
    getAwsUserInfo(accountId?: string, throwNotFound?: boolean): Promise<AwsIdentity | undefined>;
    captureImageRegistry(accountId?: string): Promise<ImageRegistry>;
    defineCluster(initial: Partial<ClusterDef>, defaults?: Partial<ClusterDef>): Promise<{
        spec: ClusterDef;
        defaults: Partial<ClusterDef>;
    }>;
    private toIngressExposure;
    private toIngressDef;
    /** Mutates the given clusterDef object */
    private promptForClusterAccess;
    promptForNodeGroup(initial: AtLeast<ClusterDef, "name">, nodePoolName: string, defaultMaxNodes?: number): Promise<api.NodePoolDef>;
    promptForIngressSpec(current?: Partial<IngressDef>): Promise<IngressDef | undefined>;
    defineClusterCaptureParams(initial: Partial<ClusterDef>, defaults?: Partial<ClusterDef>): Promise<{
        spec: ClusterCaptureDef;
        defaults: Partial<ClusterDef>;
    }>;
    private promptForName;
    private promptForNodeSpec;
    private promptForLocation;
    private promptForVpcAndSubnets;
    /** Enforces the rule that when selecting existing subnets for the cluster,
     * the subnets must support the ingress (and thereby load balancer) specifications.
     *
     * That is:
     * a) If the user sspecified a public ingress load balancer,
     *    then the cluster MUST have a PUBLIC subnet for that load balancer.
     *
     * ...PLUS...
     *
     * b) If the user specified a private ingress load balancer,
     *    then the cluster MUST have a PRIVATE subnet for that load balancer.
     */
    private validateSubnets;
    /** Gets the value of a tag called "Name", with a case-insensitive search
     * (ie: works for `"name", "nAme", "NAME"`, etc). */
    private buildVpcDescriptor;
    /** Gets the value of a tag called "Name", with a case-insensitive search
   * (ie: works for `"name", "nAme", "NAME"`, etc). */
    private buildSubnetDescriptor;
    /** Selects the given key from the dictionary, with case-INSENSITIVE key search.
     * eg:
     * given: { "Name": "Joe" }
     * getValueWithoutCase("name");
     * result: "Joe"
     */
    private getValueWithoutCase;
    /** Asks the user whether to keep the default version, and if not presents a select list. */
    private promptForK8sVersion;
    captureFileStore(accountId: string, defaults: Partial<FileStoreDef>, allowUserInteraction: boolean): Promise<FileStoreDef | undefined>;
    private promptForS3Bucket;
    protected createAuditable(): IAuditable;
}
