emr

package
v1.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 24, 2026 License: MIT Imports: 26 Imported by: 0

README

EMR

Parity grade: A · SDK aws-sdk-go-v2/service/emr@v1.64.4 · last audited 2026-08-07 (8c56f4eb9)

Coverage

Metric Value
PARITY entries audited 65 (65 ok)
Feature families 1 (1 ok)
Known gaps 1
Structural gaps (can't be emulated) 4
Deferred items 0
Resource leaks clean
Known gaps
  • ListInstances synthesized fleet instances leave InstanceType blank: InstanceFleet (unlike InstanceGroup) only tracks aggregate TargetOnDemandCapacity/TargetSpotCapacity/Provisioned* counts, not a per-instance-type breakdown -- AddInstanceFleet's real wire input accepts InstanceTypeConfigs (a weighted list of candidate instance types) but gopherstack's InstanceFleetSpec never captured it at all, a pre-existing gap larger than this pass's ListInstances-synthesis scope. This IS buildable (thread InstanceTypeConfigs through AddInstanceFleet/RunJobFlow's inline fleet spec, pick a type per synthesized instance) but was left out of this pass to stay in scope; leaving InstanceType blank rather than inventing a plausible-looking type avoids fabricating data the backend doesn't have. (bd: gopherstack-dqd8)
Structural gaps

These do not block an A grade — no implementation could produce real data here because the underlying data source cannot exist in an emulator.

  • Cluster.OutpostArn stays omitted (nil): the real value is derived from which Outpost the launch subnet belongs to, a subnet-to-Outpost topology fact that lives in EC2/Outposts, not in anything RunJobFlowInput passes to EMR directly. Gopherstack's EMR has no cross-service lookup into services/outposts' subnet/Outpost state, and most clusters are not Outpost-launched anyway (nil is the correct value for the common case); wiring a real cross-service resolution is a distinct, larger feature than an EMR-local field fix. (bd: gopherstack-dqd8)
  • Cluster.MasterPublicDnsName stays omitted (nil): a real DNS name comes from the EC2 instance actually launched for the master node. Gopherstack's EMR never creates a corresponding EC2 instance (ListInstances synthesizes lightweight ClusterInstance records, not real ec2.Instance resources with their own IP/DNS allocation), so there is no real DNS name to report; inventing one would be exactly the fabrication this campaign removes elsewhere. (bd: gopherstack-dqd8)
  • Cluster.ExtendedSupport stays omitted (nil/false): real AWS derives this from a release-label EOL/extended-support enrollment table that AWS updates over time (not encoded anywhere in the SDK types or wire shapes -- the SDK doc literally marks the field 'Reserved'). There is no verifiable source of truth to compute it from, only AWS's changing operational policy data, which does not belong hardcoded into an emulator. (bd: gopherstack-dqd8)
  • Cluster.NormalizedInstanceHours stays omitted (nil): real AWS accrues this from actual wall-clock instance runtime multiplied by an m1.small-relative weight per instance type, tracked continuously by the real service as instances run. Gopherstack simulates clusters as provisioned instantly (see instanceGroupStateRunning) with no per-instance runtime clock and no published m1.small-relative weight table in the SDK, so there is no real accrual to report -- approximating it from CreationDateTime alone without AWS's actual weight table would be a fabricated number dressed as a real one. (bd: gopherstack-dqd8)

More

Documentation

Index

Constants

View Source
const (
	StateWaiting              = "WAITING"
	StateTerminated           = "TERMINATED"
	StateTerminatedWithErrors = "TERMINATED_WITH_ERRORS"

	// StateRunning is the real ClusterState value StartSession's doc allows
	// sessions to start against, alongside StateWaiting. This backend's own
	// cluster state machine never produces RUNNING -- clusters are created
	// directly in WAITING (see buildNewCluster) and go straight from WAITING
	// to TERMINATED (see terminateSingle), with no simulated
	// STARTING/BOOTSTRAPPING/RUNNING/TERMINATING in between -- so in
	// practice only StateWaiting ever passes the sessionCanStart check
	// below. StateRunning is included for correctness against the real API
	// and forward-compatibility (e.g. a hand-seeded test cluster).
	StateRunning = "RUNNING"

	StepStatePending   = "PENDING"
	StepStateCompleted = "COMPLETED"
	StepStateCancelled = "CANCELLED"

	// SessionStateSubmitted and its siblings below mirror the real
	// SessionState enum (aws-sdk-go-v2/service/emr/types/enums.go) verbatim:
	// SUBMITTED, STARTING, STARTED, IDLE, BUSY, TERMINATING, TERMINATED,
	// FAILED. This backend only ever drives two of them -- see sessions.go's
	// package doc comment for the full state-model rationale.
	SessionStateSubmitted   = "SUBMITTED"
	SessionStateStarting    = "STARTING"
	SessionStateStarted     = "STARTED"
	SessionStateIdle        = "IDLE"
	SessionStateBusy        = "BUSY"
	SessionStateTerminating = "TERMINATING"
	SessionStateTerminated  = "TERMINATED"
	SessionStateFailed      = "FAILED"
)
View Source
const (
	NotebookStatusRunning  = "RUNNING"
	NotebookStatusStopping = "STOPPING"
	NotebookStatusStopped  = "STOPPED"
	NotebookStatusFinished = "FINISHED"
)

NotebookExecutionStatus values for a notebook execution.

Variables

View Source
var (
	ErrNotFound      = awserr.New("ClientException", awserr.ErrNotFound)
	ErrAlreadyExists = awserr.New("ClientException", awserr.ErrAlreadyExists)
)
View Source
var ErrNilAppContext = errors.New("EMR provider: nil AppContext")

ErrNilAppContext is returned when Init is called with a nil AppContext.

View Source
var ErrValidation = awserr.New(
	"ValidationException: required field is missing",
	awserr.ErrInvalidParameter,
)

Functions

This section is empty.

Types

type Application

type Application struct {
	Name    string `json:"Name"`
	Version string `json:"Version,omitempty"`
}

Application represents an EMR application bundled in a cluster.

type AutoScalingConstraints

type AutoScalingConstraints struct {
	MinCapacity int `json:"MinCapacity"`
	MaxCapacity int `json:"MaxCapacity"`
}

AutoScalingConstraints defines capacity bounds for an auto-scaling policy.

type AutoScalingPolicyDetail

type AutoScalingPolicyDetail struct {
	Status      map[string]string      `json:"Status"`
	Rules       []ScalingRule          `json:"Rules,omitempty"`
	Constraints AutoScalingConstraints `json:"Constraints"`
}

AutoScalingPolicyDetail is stored on an instance group after PutAutoScalingPolicy.

type AutoScalingPolicySpec

type AutoScalingPolicySpec struct {
	Rules       []ScalingRule          `json:"Rules,omitempty"`
	Constraints AutoScalingConstraints `json:"Constraints"`
}

AutoScalingPolicySpec is used as input to PutAutoScalingPolicy.

type AutoTerminationPolicy

type AutoTerminationPolicy struct {
	IdleTimeout int64 `json:"IdleTimeout"`
}

AutoTerminationPolicy defines the auto-termination idle timeout for a cluster.

type BlockPublicAccessConfiguration

type BlockPublicAccessConfiguration struct {
	PermittedPublicSecurityGroupRuleRanges []PortRange `json:"PermittedPublicSecurityGroupRuleRanges,omitempty"`
	BlockPublicSecurityGroupRules          bool        `json:"BlockPublicSecurityGroupRules"`
	// contains filtered or unexported fields
}

BlockPublicAccessConfiguration is the account-level block-public-access config.

type BootstrapActionConfig

type BootstrapActionConfig struct {
	Name                  string                `json:"Name"`
	ScriptBootstrapAction BootstrapActionScript `json:"ScriptBootstrapAction"`
}

BootstrapActionConfig is the full bootstrap action specification used in RunJobFlow input.

type BootstrapActionScript

type BootstrapActionScript struct {
	Path string   `json:"Path"`
	Args []string `json:"Args,omitempty"`
}

BootstrapActionScript holds the script path and arguments for a bootstrap action.

type CancelStepsInfo

type CancelStepsInfo struct {
	StepID string `json:"StepId"`
	Status string `json:"Status"`
	Reason string `json:"Reason,omitempty"`
}

CancelStepsInfo represents the result of cancelling a single step.

type CloudWatchAlarmDefinition

type CloudWatchAlarmDefinition struct {
	ComparisonOperator string  `json:"ComparisonOperator"`
	MetricName         string  `json:"MetricName"`
	Namespace          string  `json:"Namespace,omitempty"`
	Statistic          string  `json:"Statistic,omitempty"`
	Unit               string  `json:"Unit,omitempty"`
	EvaluationPeriods  int     `json:"EvaluationPeriods"`
	Period             int     `json:"Period"`
	Threshold          float64 `json:"Threshold"`
}

CloudWatchAlarmDefinition is the CloudWatch alarm that triggers scaling.

type CloudWatchLogConfiguration added in v1.3.1

type CloudWatchLogConfiguration struct {
	LogTypes            map[string][]string `json:"LogTypes,omitempty"`
	LogGroupName        string              `json:"LogGroupName,omitempty"`
	LogStreamNamePrefix string              `json:"LogStreamNamePrefix,omitempty"`
	EncryptionKeyArn    string              `json:"EncryptionKeyArn,omitempty"`
	Enabled             bool                `json:"Enabled"`
}

CloudWatchLogConfiguration controls CloudWatch log publishing, part of RunJobFlow's MonitoringConfiguration and echoed back on Cluster.

type Cluster

type Cluster struct {
	Ec2InstanceAttributes   *EC2InstanceAttributes   `json:"Ec2InstanceAttributes"`
	KerberosAttributes      *KerberosAttributes      `json:"KerberosAttributes,omitempty"`
	MonitoringConfiguration *MonitoringConfiguration `json:"MonitoringConfiguration,omitempty"`

	Status                 ClusterStatus `json:"Status"`
	ScaleDownBehavior      string        `json:"ScaleDownBehavior,omitempty"`
	ID                     string        `json:"Id"`
	ARN                    string        `json:"ClusterArn"`
	ReleaseLabel           string        `json:"ReleaseLabel"`
	OSReleaseLabel         string        `json:"OSReleaseLabel,omitempty"`
	LogURI                 string        `json:"LogUri,omitempty"`
	LogEncryptionKmsKeyID  string        `json:"LogEncryptionKmsKeyId,omitempty"`
	ServiceRole            string        `json:"ServiceRole,omitempty"`
	AutoScalingRole        string        `json:"AutoScalingRole,omitempty"`
	Name                   string        `json:"Name"`
	SecurityConfiguration  string        `json:"SecurityConfiguration,omitempty"`
	CustomAmiID            string        `json:"CustomAmiId,omitempty"`
	InstanceCollectionType string        `json:"InstanceCollectionType,omitempty"`
	RepoUpgradeOnBoot      string        `json:"RepoUpgradeOnBoot,omitempty"`
	RequestedAmiVersion    string        `json:"RequestedAmiVersion,omitempty"`
	RunningAmiVersion      string        `json:"RunningAmiVersion,omitempty"`

	Tags            []Tag                  `json:"Tags"`
	Applications    []Application          `json:"Applications,omitempty"`
	Configurations  []Configuration        `json:"Configurations,omitempty"`
	PlacementGroups []PlacementGroupConfig `json:"PlacementGroups,omitempty"`

	StepConcurrencyLevel        int  `json:"StepConcurrencyLevel,omitempty"`
	EbsRootVolumeSize           int  `json:"EbsRootVolumeSize,omitempty"`
	EbsRootVolumeIops           int  `json:"EbsRootVolumeIops,omitempty"`
	EbsRootVolumeThroughput     int  `json:"EbsRootVolumeThroughput,omitempty"`
	UnhealthyNodeReplacement    bool `json:"UnhealthyNodeReplacement"`
	KeepJobFlowAliveWhenNoSteps bool `json:"KeepJobFlowAliveWhenNoSteps"`
	TerminationProtected        bool `json:"TerminationProtected"`
	VisibleToAllUsers           bool `json:"VisibleToAllUsers"`
	// AutoTerminate is the real API's inverse of KeepJobFlowAliveWhenNoSteps:
	// true means the cluster terminates after completing all steps.
	AutoTerminate bool `json:"AutoTerminate"`
	// contains filtered or unexported fields
}

Cluster represents an EMR cluster.

type ClusterInstance

type ClusterInstance struct {
	ID               string                `json:"Id"`
	Ec2InstanceID    string                `json:"Ec2InstanceId"`
	PrivateDNSName   string                `json:"PrivateDnsName"`
	PublicDNSName    string                `json:"PublicDnsName,omitempty"`
	PrivateIPAddress string                `json:"PrivateIpAddress,omitempty"`
	InstanceGroupID  string                `json:"InstanceGroupId,omitempty"`
	InstanceFleetID  string                `json:"InstanceFleetId,omitempty"`
	Market           string                `json:"Market"`
	InstanceType     string                `json:"InstanceType"`
	Status           ClusterInstanceStatus `json:"Status"`
}

ClusterInstance represents a single EC2 instance in a cluster.

type ClusterInstanceStatus

type ClusterInstanceStatus struct {
	State string `json:"State"`
}

ClusterInstanceStatus holds the state of a ClusterInstance.

type ClusterStatus

type ClusterStatus struct {
	StateChangeReason map[string]any `json:"StateChangeReason,omitempty"`
	Timeline          map[string]any `json:"Timeline,omitempty"`
	State             string         `json:"State"`
}

ClusterStatus holds the status fields for a Cluster.

type ClusterSummary

type ClusterSummary struct {
	ID         string        `json:"Id"`
	Name       string        `json:"Name"`
	Status     ClusterStatus `json:"Status"`
	ClusterArn string        `json:"ClusterArn"`
}

ClusterSummary is a trimmed-down view used for ListClusters.

NormalizedInstanceHours is a real ClusterSummary member (aws-sdk-go-v2/service/emr/types.ClusterSummary) this backend never populates -- an honest omission (a real client sees it as nil/zero), not fabricated. OutpostArn is likewise real and omitted for the same reason. ReleaseLabel used to live here but was deleted: the real ClusterSummary has no such member at all (only Id, Name, Status, ClusterArn, NormalizedInstanceHours, OutpostArn) -- it was an invented field, not an omission.

type Command

type Command struct {
	Name       string   `json:"Name"`
	ScriptPath string   `json:"ScriptPath"`
	Args       []string `json:"Args,omitempty"`
}

Command is the flattened representation of a bootstrap action returned by ListBootstrapActions.

type ComputeLimits

type ComputeLimits struct {
	UnitType                     string `json:"UnitType"`
	MinimumCapacityUnits         int    `json:"MinimumCapacityUnits"`
	MaximumCapacityUnits         int    `json:"MaximumCapacityUnits"`
	MaximumOnDemandCapacityUnits int    `json:"MaximumOnDemandCapacityUnits,omitempty"`
	MaximumCoreCapacityUnits     int    `json:"MaximumCoreCapacityUnits,omitempty"`
}

ComputeLimits defines compute bounds for managed scaling.

type ConfigProvider

type ConfigProvider interface {
	GetEMRSettings() Settings
}

ConfigProvider is a private interface to extract EMR configuration from the abstract AppContext Config.

type Configuration

type Configuration struct {
	Classification string            `json:"Classification,omitempty"`
	Properties     map[string]string `json:"Properties,omitempty"`
	Configurations []Configuration   `json:"Configurations,omitempty"`
}

Configuration is a recursive EMR classification configuration entry.

type EC2InstanceAttributes

type EC2InstanceAttributes struct {
	Ec2KeyName                     string   `json:"Ec2KeyName,omitempty"`
	Ec2SubnetID                    string   `json:"Ec2SubnetId,omitempty"`
	Ec2AvailabilityZone            string   `json:"Ec2AvailabilityZone,omitempty"`
	EmrManagedMasterSecurityGroup  string   `json:"EmrManagedMasterSecurityGroup,omitempty"`
	EmrManagedSlaveSecurityGroup   string   `json:"EmrManagedSlaveSecurityGroup,omitempty"`
	ServiceAccessSecurityGroup     string   `json:"ServiceAccessSecurityGroup,omitempty"`
	IamInstanceProfile             string   `json:"IamInstanceProfile,omitempty"`
	AdditionalMasterSecurityGroups []string `json:"AdditionalMasterSecurityGroups,omitempty"`
	AdditionalSlaveSecurityGroups  []string `json:"AdditionalSlaveSecurityGroups,omitempty"`
	RequestedEc2SubnetIDs          []string `json:"RequestedEc2SubnetIds,omitempty"`
}

EC2InstanceAttributes represents EC2 instance attributes for an EMR cluster.

type Handler

type Handler struct {
	Backend *InMemoryBackend
	// contains filtered or unexported fields
}

Handler is the Echo HTTP handler for AWS EMR operations.

func NewHandler

func NewHandler(backend *InMemoryBackend) *Handler

NewHandler creates a new EMR handler backed by backend.

func (*Handler) ChaosOperations

func (h *Handler) ChaosOperations() []string

ChaosOperations returns all operations that can be fault-injected.

func (*Handler) ChaosRegions

func (h *Handler) ChaosRegions() []string

ChaosRegions returns all regions this handler instance handles.

func (*Handler) ChaosServiceName

func (h *Handler) ChaosServiceName() string

ChaosServiceName returns the lowercase AWS service name for fault rule matching.

func (*Handler) ExtractOperation

func (h *Handler) ExtractOperation(c *echo.Context) string

ExtractOperation returns the operation name from the X-Amz-Target header.

func (*Handler) ExtractResource

func (h *Handler) ExtractResource(c *echo.Context) string

ExtractResource extracts a resource identifier from the request body.

func (*Handler) GetSupportedOperations

func (h *Handler) GetSupportedOperations() []string

GetSupportedOperations returns the list of supported operations.

"ListTagsForResource" is deliberately NOT listed here -- the real EMR SDK has no such operation (verified against aws-sdk-go-v2/service/emr: only AddTags/RemoveTags exist; a real client reads tags back via DescribeCluster.Tags/DescribeStudio.Tags). See the opListTagsForResource comment in buildOps below for why the route itself stays wired.

func (*Handler) Handler

func (h *Handler) Handler() echo.HandlerFunc

Handler returns the Echo handler function for EMR requests.

func (*Handler) MatchPriority

func (h *Handler) MatchPriority() int

MatchPriority returns the routing priority.

func (*Handler) Name

func (h *Handler) Name() string

Name returns the service name.

func (*Handler) Reset

func (h *Handler) Reset()

Reset clears all in-memory state from the backend.

func (*Handler) Restore

func (h *Handler) Restore(ctx context.Context, data []byte) error

Restore implements persistence.Persistable by delegating to the backend.

func (*Handler) RouteMatcher

func (h *Handler) RouteMatcher() service.Matcher

RouteMatcher returns a function that matches EMR requests via X-Amz-Target.

func (*Handler) Snapshot

func (h *Handler) Snapshot(ctx context.Context) []byte

Snapshot implements persistence.Persistable by delegating to the backend.

func (*Handler) StartWorker

func (h *Handler) StartWorker(ctx context.Context) error

StartWorker starts the background janitor if configured.

func (*Handler) WithJanitor

func (h *Handler) WithJanitor(interval, terminatedTTL time.Duration, taskTimeout ...time.Duration) *Handler

WithJanitor attaches a background janitor to the handler.

type InMemoryBackend

type InMemoryBackend struct {
	// contains filtered or unexported fields
}

InMemoryBackend stores EMR state in memory.

The resource collections below were previously nested by region (outer key = region, e.g. map[string]map[string]*Cluster) so that same-named resources in different regions were fully isolated. Phase 3.3 of the datalayer refactor replaces each of those with a flat *store.Table, keyed by the composite "region|id" string (see regionKey), with a companion *store.Index grouping entries by region for per-region scans -- the same region-qualified-table pattern services/neptune and services/mwaa use. The block-public-access configuration/metadata are account-level (one per region in AWS, not per-resource), so each is a *store.Table keyed directly by region with no secondary index needed. arnIndex (map[string]map[string]string) is deliberately NOT converted: store.Table requires a *V value with its own identity, but each entry here is a bare string with no identifier of its own; it remains a plain region-nested map.

func NewInMemoryBackend

func NewInMemoryBackend(accountID, region string) *InMemoryBackend

NewInMemoryBackend creates a new InMemoryBackend.

func (*InMemoryBackend) AddClusterInternal

func (b *InMemoryBackend) AddClusterInternal(ctx context.Context, cluster *Cluster)

AddClusterInternal seeds a cluster directly into the backend for testing.

func (*InMemoryBackend) AddInstanceFleet

func (b *InMemoryBackend) AddInstanceFleet(
	ctx context.Context,
	clusterID string,
	spec InstanceFleetSpec,
) (*InstanceFleet, string, error)

AddInstanceFleet adds an instance fleet to an existing cluster.

func (*InMemoryBackend) AddInstanceGroups

func (b *InMemoryBackend) AddInstanceGroups(
	ctx context.Context,
	clusterID string,
	specs []InstanceGroupSpec,
) ([]string, string, error)

AddInstanceGroups adds new instance groups to an existing cluster.

func (*InMemoryBackend) AddJobFlowSteps

func (b *InMemoryBackend) AddJobFlowSteps(
	ctx context.Context, jobFlowID string, specs []StepSpec, executionRoleArn string,
) ([]string, error)

AddJobFlowSteps adds steps to a cluster and returns their IDs. executionRoleArn is AddJobFlowStepsInput.ExecutionRoleArn, a real, call-level (not per-step) field (emr@v1.64.4 api_op_AddJobFlowSteps.go) applied to every step added by this call -- echoed back as each Step.ExecutionRoleArn.

func (*InMemoryBackend) AddPersistentAppUIInternal

func (b *InMemoryBackend) AddPersistentAppUIInternal(ctx context.Context, ui PersistentAppUI)

AddPersistentAppUIInternal seeds a persistent app UI directly into the backend for testing.

func (*InMemoryBackend) AddSecurityConfigInternal

func (b *InMemoryBackend) AddSecurityConfigInternal(ctx context.Context, sc SecurityConfiguration)

AddSecurityConfigInternal seeds a security configuration directly into the backend for testing.

func (*InMemoryBackend) AddStudioInternal

func (b *InMemoryBackend) AddStudioInternal(ctx context.Context, studio Studio)

AddStudioInternal seeds a studio directly into the backend for testing.

func (*InMemoryBackend) AddTags

func (b *InMemoryBackend) AddTags(ctx context.Context, resourceID string, tags []Tag) error

AddTags adds or updates tags on a cluster or studio identified by ARN or ID. When resourceID is an ARN the region is resolved from the ARN, otherwise the ctx region (falling back to the backend default) is used.

func (*InMemoryBackend) CancelSteps

func (b *InMemoryBackend) CancelSteps(
	ctx context.Context,
	clusterID string,
	stepIDs []string,
) ([]*CancelStepsInfo, error)

CancelSteps cancels pending steps on a cluster.

func (*InMemoryBackend) CreatePersistentAppUI

func (b *InMemoryBackend) CreatePersistentAppUI(
	ctx context.Context,
	targetResourceArn string,
) (*PersistentAppUI, error)

CreatePersistentAppUI creates a new persistent application user interface.

func (*InMemoryBackend) CreateSecurityConfiguration

func (b *InMemoryBackend) CreateSecurityConfiguration(
	ctx context.Context,
	name, securityConfig string,
) (*SecurityConfiguration, error)

CreateSecurityConfiguration creates a new security configuration.

func (*InMemoryBackend) CreateStudio

func (b *InMemoryBackend) CreateStudio(
	ctx context.Context,
	name, description, authMode, defaultS3Location, engineSGID, serviceRole, vpcID, workspaceSGID string,
	subnetIDs []string, tags []Tag,
	idcUserAssignment string, trustedIdentityPropagationEnabled bool,
) (*Studio, error)

CreateStudio creates a new EMR Studio.

func (*InMemoryBackend) CreateStudioSessionMapping

func (b *InMemoryBackend) CreateStudioSessionMapping(
	ctx context.Context,
	studioID, identityType, identityID, identityName, sessionPolicyArn string,
) error

CreateStudioSessionMapping maps a user or group to an EMR Studio.

func (*InMemoryBackend) DeleteSecurityConfiguration

func (b *InMemoryBackend) DeleteSecurityConfiguration(ctx context.Context, name string) error

DeleteSecurityConfiguration deletes a security configuration by name.

func (*InMemoryBackend) DeleteStudio

func (b *InMemoryBackend) DeleteStudio(ctx context.Context, studioID string) error

DeleteStudio deletes an EMR Studio by ID.

func (*InMemoryBackend) DeleteStudioSessionMapping

func (b *InMemoryBackend) DeleteStudioSessionMapping(
	ctx context.Context,
	studioID, identityType, identityID, identityName string,
) error

DeleteStudioSessionMapping removes a user or group from an EMR Studio.

func (*InMemoryBackend) DescribeCluster

func (b *InMemoryBackend) DescribeCluster(ctx context.Context, id string) (*Cluster, error)

DescribeCluster returns a cluster by its ID.

func (*InMemoryBackend) DescribeJobFlows

func (b *InMemoryBackend) DescribeJobFlows(
	ctx context.Context,
	ids, states []string,
	createdAfter, createdBefore *time.Time,
) []JobFlow

DescribeJobFlows translates clusters into the legacy JobFlow format.

func (*InMemoryBackend) DescribeNotebookExecution

func (b *InMemoryBackend) DescribeNotebookExecution(ctx context.Context, id string) (*NotebookExecution, error)

DescribeNotebookExecution returns a notebook execution by ID.

func (*InMemoryBackend) DescribePersistentAppUI

func (b *InMemoryBackend) DescribePersistentAppUI(ctx context.Context, id string) (*PersistentAppUI, error)

DescribePersistentAppUI returns a persistent app UI by ID.

func (*InMemoryBackend) DescribeReleaseLabel

func (b *InMemoryBackend) DescribeReleaseLabel(
	_ context.Context, releaseLabel string,
) (*ReleaseLabel, error)

DescribeReleaseLabel returns details about a specific release label.

func (*InMemoryBackend) DescribeSecurityConfiguration

func (b *InMemoryBackend) DescribeSecurityConfiguration(
	ctx context.Context,
	name string,
) (*SecurityConfiguration, error)

DescribeSecurityConfiguration returns the details of a security configuration.

func (*InMemoryBackend) DescribeStep

func (b *InMemoryBackend) DescribeStep(ctx context.Context, clusterID, stepID string) (*Step, error)

DescribeStep returns a single step by cluster ID and step ID.

func (*InMemoryBackend) DescribeStudio

func (b *InMemoryBackend) DescribeStudio(ctx context.Context, studioID string) (*Studio, error)

DescribeStudio returns an EMR Studio by ID.

func (*InMemoryBackend) GetAutoTerminationPolicy

func (b *InMemoryBackend) GetAutoTerminationPolicy(
	ctx context.Context,
	clusterID string,
) (*AutoTerminationPolicy, error)

GetAutoTerminationPolicy returns the auto-termination policy for a cluster, or nil if none is attached -- see GetManagedScalingPolicy for why nil (not a zero-valued policy) must be propagated.

func (*InMemoryBackend) GetBlockPublicAccessConfiguration

func (b *InMemoryBackend) GetBlockPublicAccessConfiguration(
	ctx context.Context,
) (BlockPublicAccessConfiguration, blockPublicAccessMeta)

GetBlockPublicAccessConfiguration returns the account-level block-public-access config.

func (*InMemoryBackend) GetClusterSessionCredentials

func (b *InMemoryBackend) GetClusterSessionCredentials(
	ctx context.Context,
	clusterID, executionRoleArn string,
) (map[string]any, time.Time, error)

GetClusterSessionCredentials returns synthesized credentials for cluster session access.

func (*InMemoryBackend) GetManagedScalingPolicy

func (b *InMemoryBackend) GetManagedScalingPolicy(
	ctx context.Context, clusterID string,
) (*ManagedScalingPolicy, error)

GetManagedScalingPolicy returns the managed scaling policy for a cluster, or nil if none is attached -- real GetManagedScalingPolicyOutput.ManagedScalingPolicy is a pointer that is omitted from the wire entirely when unset (not a zero-valued object), so callers must propagate nil rather than substitute an empty policy.

func (*InMemoryBackend) GetOnClusterPresignedURL

func (b *InMemoryBackend) GetOnClusterPresignedURL(_ context.Context, clusterID, region string) (string, error)

GetOnClusterPresignedURL returns a presigned URL for an on-cluster app UI, verifying cluster exists.

func (*InMemoryBackend) GetPresignedURL

func (b *InMemoryBackend) GetPresignedURL(id, region string) string

GetPresignedURL returns a synthetic presigned URL for a persistent app UI.

func (*InMemoryBackend) GetSession added in v1.2.0

func (b *InMemoryBackend) GetSession(ctx context.Context, clusterID, sessionID string) (*Session, error)

GetSession returns a single session by cluster ID and session ID.

func (*InMemoryBackend) GetSessionEndpoint added in v1.2.0

func (b *InMemoryBackend) GetSessionEndpoint(
	ctx context.Context,
	clusterID, sessionID string,
) (*SessionEndpointResult, error)

GetSessionEndpoint returns the Spark Connect endpoint URL, a synthesized auth token, and VPC-peering credentials for a session, verifying the cluster and session both exist.

func (*InMemoryBackend) GetStudioSessionMapping

func (b *InMemoryBackend) GetStudioSessionMapping(
	ctx context.Context,
	studioID, identityType, identityID, identityName string,
) (*StudioSessionMapping, error)

GetStudioSessionMapping returns a session mapping for a studio.

func (*InMemoryBackend) ListBootstrapActions

func (b *InMemoryBackend) ListBootstrapActions(
	ctx context.Context,
	clusterID, marker string,
) ([]Command, string, error)

ListBootstrapActions returns the bootstrap actions for a cluster, paginated.

func (*InMemoryBackend) ListClusters

func (b *InMemoryBackend) ListClusters(ctx context.Context, params ListClustersParams) ([]ClusterSummary, string)

ListClusters returns cluster summaries matching the given filter, sorted by creation time descending.

func (*InMemoryBackend) ListInstanceFleets

func (b *InMemoryBackend) ListInstanceFleets(ctx context.Context, clusterID string) ([]InstanceFleet, error)

ListInstanceFleets returns the instance fleets for a cluster by its ID.

func (*InMemoryBackend) ListInstanceGroups

func (b *InMemoryBackend) ListInstanceGroups(ctx context.Context, clusterID string) ([]InstanceGroup, error)

ListInstanceGroups returns the instance groups for a cluster by its ID.

func (*InMemoryBackend) ListInstances

func (b *InMemoryBackend) ListInstances(
	ctx context.Context,
	clusterID string,
	params ListInstancesParams,
) ([]ClusterInstance, string)

ListInstances synthesizes per-group instances for a cluster.

func (*InMemoryBackend) ListNotebookExecutions

func (b *InMemoryBackend) ListNotebookExecutions(
	ctx context.Context, params ListNotebookExecutionsParams,
) ([]NotebookExecution, string)

ListNotebookExecutions returns paginated notebook executions matching the filter.

func (*InMemoryBackend) ListReleaseLabels

func (b *InMemoryBackend) ListReleaseLabels(
	_ context.Context, prefix, application, marker string,
) ([]string, string)

ListReleaseLabels returns release labels optionally filtered by prefix and application.

func (*InMemoryBackend) ListSecurityConfigurations

func (b *InMemoryBackend) ListSecurityConfigurations(
	ctx context.Context,
	marker string,
) ([]SecurityConfigSummary, string)

ListSecurityConfigurations returns all security configurations, sorted by name.

func (*InMemoryBackend) ListSessions added in v1.2.0

func (b *InMemoryBackend) ListSessions(
	ctx context.Context,
	clusterID string,
	states []string,
	marker string,
) ([]Session, string, error)

ListSessions returns the sessions on a cluster, optionally filtered by state, newest first (matching real ListSessions' doc: "Newer sessions are returned first").

func (*InMemoryBackend) ListSteps

func (b *InMemoryBackend) ListSteps(
	ctx context.Context,
	clusterID string,
	stepStates []string,
	stepIDs []string,
	marker string,
) ([]Step, string)

ListSteps returns steps for a cluster, optionally filtered by state and/or ID.

func (*InMemoryBackend) ListStudioSessionMappings

func (b *InMemoryBackend) ListStudioSessionMappings(
	ctx context.Context,
	studioID, identityType string,
) []StudioSessionMapping

ListStudioSessionMappings returns session mappings for a studio, optionally filtered by identity type.

func (*InMemoryBackend) ListStudios

func (b *InMemoryBackend) ListStudios(ctx context.Context, marker string) ([]StudioSummary, string)

ListStudios returns all studios as summaries, sorted by name.

func (*InMemoryBackend) ListSupportedInstanceTypes

func (b *InMemoryBackend) ListSupportedInstanceTypes(
	_ context.Context, releaseLabel, marker string,
) ([]SupportedInstanceType, string)

ListSupportedInstanceTypes returns the static catalog of EMR-supported instance types.

func (*InMemoryBackend) ListTagsForResource

func (b *InMemoryBackend) ListTagsForResource(ctx context.Context, resourceID string) ([]Tag, error)

ListTagsForResource returns tags for a cluster or studio identified by ARN or ID, sorted by key.

func (*InMemoryBackend) ModifyCluster

func (b *InMemoryBackend) ModifyCluster(
	ctx context.Context, clusterID string, stepConcurrencyLevel int,
) (int, error)

ModifyCluster updates StepConcurrencyLevel on a cluster.

func (*InMemoryBackend) ModifyInstanceFleet

func (b *InMemoryBackend) ModifyInstanceFleet(
	ctx context.Context,
	clusterID string,
	mod InstanceFleetModification,
) error

ModifyInstanceFleet updates target capacities on an instance fleet.

func (*InMemoryBackend) ModifyInstanceGroups

func (b *InMemoryBackend) ModifyInstanceGroups(
	ctx context.Context,
	clusterID string,
	mods []InstanceGroupModification,
) error

ModifyInstanceGroups updates instance counts for the specified groups.

func (*InMemoryBackend) PutAutoScalingPolicy

func (b *InMemoryBackend) PutAutoScalingPolicy(
	ctx context.Context,
	clusterID, instanceGroupID string,
	policy AutoScalingPolicySpec,
) (*AutoScalingPolicyDetail, string, string, error)

PutAutoScalingPolicy persists an auto-scaling policy on an instance group.

func (*InMemoryBackend) PutAutoTerminationPolicy

func (b *InMemoryBackend) PutAutoTerminationPolicy(
	ctx context.Context,
	clusterID string,
	policy AutoTerminationPolicy,
) error

PutAutoTerminationPolicy sets the auto-termination policy on a cluster.

func (*InMemoryBackend) PutBlockPublicAccessConfiguration

func (b *InMemoryBackend) PutBlockPublicAccessConfiguration(
	ctx context.Context,
	config BlockPublicAccessConfiguration,
) error

PutBlockPublicAccessConfiguration sets the account-level block-public-access config.

func (*InMemoryBackend) PutManagedScalingPolicy

func (b *InMemoryBackend) PutManagedScalingPolicy(
	ctx context.Context,
	clusterID string,
	policy ManagedScalingPolicy,
) error

PutManagedScalingPolicy sets the managed scaling policy on a cluster.

func (*InMemoryBackend) Region

func (b *InMemoryBackend) Region() string

Region returns the AWS region this backend is configured for.

func (*InMemoryBackend) RemoveAutoScalingPolicy

func (b *InMemoryBackend) RemoveAutoScalingPolicy(
	ctx context.Context, clusterID, instanceGroupID string,
) error

RemoveAutoScalingPolicy clears the auto-scaling policy on an instance group.

func (*InMemoryBackend) RemoveAutoTerminationPolicy

func (b *InMemoryBackend) RemoveAutoTerminationPolicy(ctx context.Context, clusterID string) error

RemoveAutoTerminationPolicy clears the auto-termination policy on a cluster.

func (*InMemoryBackend) RemoveManagedScalingPolicy

func (b *InMemoryBackend) RemoveManagedScalingPolicy(ctx context.Context, clusterID string) error

RemoveManagedScalingPolicy clears the managed scaling policy on a cluster.

func (*InMemoryBackend) RemoveTags

func (b *InMemoryBackend) RemoveTags(ctx context.Context, resourceID string, tagKeys []string) error

RemoveTags removes tags from a cluster or studio identified by ARN or ID.

func (*InMemoryBackend) Reset

func (b *InMemoryBackend) Reset()

Reset clears all in-memory state from the backend.

func (*InMemoryBackend) Restore

func (b *InMemoryBackend) Restore(ctx context.Context, data []byte) error

Restore loads backend state from a JSON snapshot. It implements persistence.Persistable.

func (*InMemoryBackend) RunJobFlow

func (b *InMemoryBackend) RunJobFlow(ctx context.Context, params RunJobFlowParams) (*Cluster, error)

RunJobFlow creates a new EMR cluster.

func (*InMemoryBackend) SetKeepJobFlowAliveWhenNoSteps

func (b *InMemoryBackend) SetKeepJobFlowAliveWhenNoSteps(
	ctx context.Context, jobFlowIDs []string, keep bool,
) error

SetKeepJobFlowAliveWhenNoSteps sets the KeepJobFlowAliveWhenNoSteps flag.

func (*InMemoryBackend) SetTerminationProtection

func (b *InMemoryBackend) SetTerminationProtection(
	ctx context.Context, jobFlowIDs []string, protect bool,
) error

SetTerminationProtection sets the TerminationProtected flag on clusters.

func (*InMemoryBackend) SetUnhealthyNodeReplacement

func (b *InMemoryBackend) SetUnhealthyNodeReplacement(
	ctx context.Context, jobFlowIDs []string, replace bool,
) error

SetUnhealthyNodeReplacement sets the UnhealthyNodeReplacement flag.

func (*InMemoryBackend) SetVisibleToAllUsers

func (b *InMemoryBackend) SetVisibleToAllUsers(
	ctx context.Context, jobFlowIDs []string, visible bool,
) error

SetVisibleToAllUsers sets the VisibleToAllUsers flag.

func (*InMemoryBackend) Snapshot

func (b *InMemoryBackend) Snapshot(ctx context.Context) []byte

Snapshot serialises the backend state to JSON. It implements persistence.Persistable.

func (*InMemoryBackend) StartNotebookExecution

func (b *InMemoryBackend) StartNotebookExecution(
	ctx context.Context,
	editorID, name, params, engineID string,
	tags []Tag,
) (*NotebookExecution, error)

StartNotebookExecution creates a new notebook execution in RUNNING state.

func (*InMemoryBackend) StartSession added in v1.2.0

func (b *InMemoryBackend) StartSession(ctx context.Context, params StartSessionParams) (*Session, error)

StartSession creates and starts a new interactive session on a cluster. The referenced cluster must exist and be in a state that can host a session (see sessionCanStart).

func (*InMemoryBackend) StopNotebookExecution

func (b *InMemoryBackend) StopNotebookExecution(ctx context.Context, id string) error

StopNotebookExecution transitions a RUNNING execution to STOPPED.

func (*InMemoryBackend) TaggedResources added in v1.2.0

func (b *InMemoryBackend) TaggedResources() []TaggedEntry

TaggedResources returns every EMR cluster and studio ARN, across all regions, that currently has at least one tag. b.clusters and b.studios are each a single store.Table keyed by "region|id" (see regionKey), so All() on each already spans every region without a per-region loop.

func (*InMemoryBackend) TerminateJobFlows

func (b *InMemoryBackend) TerminateJobFlows(ctx context.Context, ids []string) error

TerminateJobFlows marks the specified clusters as TERMINATED. Returns ValidationException if any cluster has termination protection.

func (*InMemoryBackend) TerminateSession added in v1.2.0

func (b *InMemoryBackend) TerminateSession(ctx context.Context, clusterID, sessionID string) (*Session, error)

TerminateSession terminates an active session on a cluster.

func (*InMemoryBackend) UpdateStudio

func (b *InMemoryBackend) UpdateStudio(
	ctx context.Context,
	studioID, name, description, defaultS3Location string,
	subnetIDs []string,
) error

UpdateStudio updates mutable fields on an EMR Studio. Real UpdateStudioInput.SubnetIds doc: "The list can include new subnet IDs, but must also include all of the subnet IDs previously associated with the Studio" -- i.e. it is a full replace, not a merge, so an empty/absent subnetIDs leaves the existing set untouched (same "empty string means unset" convention already used for name/description/defaultS3Location) while a non-empty one replaces it wholesale.

func (*InMemoryBackend) UpdateStudioSessionMapping

func (b *InMemoryBackend) UpdateStudioSessionMapping(
	ctx context.Context,
	studioID, identityType, identityID, identityName, sessionPolicyArn string,
) error

UpdateStudioSessionMapping changes the SessionPolicyArn on a mapping.

type InstanceFleet

type InstanceFleet struct {
	Status                      InstanceFleetStatus `json:"Status"`
	ID                          string              `json:"Id"`
	Name                        string              `json:"Name"`
	InstanceFleetType           string              `json:"InstanceFleetType"`
	TargetOnDemandCapacity      int                 `json:"TargetOnDemandCapacity"`
	TargetSpotCapacity          int                 `json:"TargetSpotCapacity"`
	ProvisionedOnDemandCapacity int                 `json:"ProvisionedOnDemandCapacity"`
	ProvisionedSpotCapacity     int                 `json:"ProvisionedSpotCapacity"`
}

InstanceFleet represents an EMR instance fleet returned by AddInstanceFleet.

type InstanceFleetModification

type InstanceFleetModification struct {
	InstanceFleetID        string `json:"InstanceFleetId"`
	TargetOnDemandCapacity int    `json:"TargetOnDemandCapacity,omitempty"`
	TargetSpotCapacity     int    `json:"TargetSpotCapacity,omitempty"`
}

InstanceFleetModification describes a fleet target capacity change.

type InstanceFleetSpec

type InstanceFleetSpec struct {
	Name                   string          `json:"Name"`
	InstanceFleetType      string          `json:"InstanceFleetType"`
	Configurations         []Configuration `json:"Configurations,omitempty"`
	TargetOnDemandCapacity int             `json:"TargetOnDemandCapacity"`
	TargetSpotCapacity     int             `json:"TargetSpotCapacity"`
}

InstanceFleetSpec is the input specification for an instance fleet.

type InstanceFleetStatus

type InstanceFleetStatus struct {
	State string `json:"State"`
}

InstanceFleetStatus tracks the provisioning state of an EMR instance fleet.

type InstanceGroup

type InstanceGroup struct {
	AutoScalingPolicy      *AutoScalingPolicyDetail `json:"AutoScalingPolicy,omitempty"`
	Status                 InstanceGroupStatus      `json:"Status"`
	ID                     string                   `json:"Id"`
	Name                   string                   `json:"Name"`
	Market                 string                   `json:"Market"`
	BidPrice               string                   `json:"BidPrice,omitempty"`
	InstanceGroupType      string                   `json:"InstanceGroupType"`
	InstanceType           string                   `json:"InstanceType"`
	Configurations         []Configuration          `json:"Configurations,omitempty"`
	RequestedInstanceCount int                      `json:"RequestedInstanceCount"`
	RunningInstanceCount   int                      `json:"RunningInstanceCount"`
}

InstanceGroup represents an EMR instance group returned by ListInstanceGroups.

type InstanceGroupModification

type InstanceGroupModification struct {
	InstanceGroupID string `json:"InstanceGroupId"`
	InstanceCount   int    `json:"InstanceCount"`
}

InstanceGroupModification describes a single instance group count change.

type InstanceGroupSpec

type InstanceGroupSpec struct {
	Name           string          `json:"Name"`
	Market         string          `json:"Market"`
	InstanceRole   string          `json:"InstanceRole"`
	InstanceType   string          `json:"InstanceType"`
	BidPrice       string          `json:"BidPrice,omitempty"`
	Configurations []Configuration `json:"Configurations,omitempty"`
	InstanceCount  int             `json:"InstanceCount"`
}

InstanceGroupSpec is the input specification for an instance group from RunJobFlow.

type InstanceGroupStatus

type InstanceGroupStatus struct {
	State string `json:"State"`
}

InstanceGroupStatus is the status of an EMR instance group.

type Janitor

type Janitor struct {
	Backend       *InMemoryBackend
	Interval      time.Duration
	TerminatedTTL time.Duration
	TaskTimeout   time.Duration
}

Janitor is the EMR background worker that sweeps terminated clusters after a configurable TTL, matching the AWS behavior where terminated clusters remain visible for approximately one hour.

func NewJanitor

func NewJanitor(backend *InMemoryBackend, interval, terminatedTTL time.Duration) *Janitor

NewJanitor creates a new EMR Janitor for the given backend. If interval or terminatedTTL are zero, defaults are used.

func (*Janitor) Run

func (j *Janitor) Run(ctx context.Context)

Run runs the janitor loop until ctx is cancelled.

func (*Janitor) SweepOnce

func (j *Janitor) SweepOnce(ctx context.Context)

SweepOnce runs a single sweep pass. Exposed for testing.

type JobFlow

type JobFlow struct {
	JobFlowID             string                       `json:"JobFlowId"`
	Name                  string                       `json:"Name"`
	ReleaseLabel          string                       `json:"ReleaseLabel,omitempty"`
	LogURI                string                       `json:"LogUri,omitempty"`
	ServiceRole           string                       `json:"ServiceRole,omitempty"`
	Instances             JobFlowInstancesDetail       `json:"Instances"`
	ExecutionStatusDetail JobFlowExecutionStatusDetail `json:"ExecutionStatusDetail"`
}

JobFlow is the legacy format returned by DescribeJobFlows.

type JobFlowExecutionStatusDetail

type JobFlowExecutionStatusDetail struct {
	State             string  `json:"State"`
	StateChangeReason string  `json:"LastStateChangeReason,omitempty"`
	CreationDateTime  float64 `json:"CreationDateTime"`
	EndDateTime       float64 `json:"EndDateTime,omitempty"`
}

JobFlowExecutionStatusDetail holds the legacy execution status.

StateChangeReason is tagged LastStateChangeReason: the real types.JobFlowExecutionStatusDetail has no StateChangeReason member at all (deserializers.go's awsAwsjson11_deserializeDocumentJobFlowExecutionStatusDetail case list has only LastStateChangeReason) -- every real client's LastStateChangeReason decoded empty regardless of backend state. This is a different type from Cluster's ClusterStateChangeReason (Code/Message) and from Session's StateChangeReason (itself correctly named) -- do not generalise the tag across types.

type JobFlowInstancesDetail

type JobFlowInstancesDetail struct {
	MasterInstanceType string `json:"MasterInstanceType,omitempty"`
	SlaveInstanceType  string `json:"SlaveInstanceType,omitempty"`
	InstanceCount      int    `json:"InstanceCount"`
}

JobFlowInstancesDetail holds the legacy instances detail.

type KerberosAttributes added in v1.2.0

type KerberosAttributes struct {
	Realm                            string `json:"Realm"`
	KdcAdminPassword                 string `json:"KdcAdminPassword"`
	ADDomainJoinUser                 string `json:"ADDomainJoinUser,omitempty"`
	ADDomainJoinPassword             string `json:"ADDomainJoinPassword,omitempty"`
	CrossRealmTrustPrincipalPassword string `json:"CrossRealmTrustPrincipalPassword,omitempty"`
}

KerberosAttributes holds Kerberos configuration for a cluster, set via RunJobFlow and echoed back on Cluster when Kerberos authentication is enabled using a security configuration.

type KeyValue added in v1.3.1

type KeyValue struct {
	Key   string `json:"Key"`
	Value string `json:"Value"`
}

KeyValue is a Hadoop job property pair, the real REQUEST-side wire shape for step Properties (types.KeyValue, serializers.go's awsAwsjson11_serializeDocumentKeyValue: {"Key":..., "Value":...}).

type ListClustersParams

type ListClustersParams struct {
	CreatedAfter  *time.Time
	CreatedBefore *time.Time
	Marker        string
	ClusterStates []string
}

ListClustersParams holds filter and pagination params for ListClusters.

type ListInstancesParams

type ListInstancesParams struct {
	InstanceGroupID    string
	InstanceFleetID    string
	InstanceFleetType  string
	Marker             string
	InstanceGroupTypes []string
	InstanceStates     []string
}

ListInstancesParams holds filter params for ListInstances.

type ListNotebookExecutionsParams

type ListNotebookExecutionsParams struct {
	EditorID string
	Status   string
	Marker   string
}

ListNotebookExecutionsParams holds filters for ListNotebookExecutions.

type ManagedScalingPolicy

type ManagedScalingPolicy struct {
	ComputeLimits ComputeLimits `json:"ComputeLimits"`
}

ManagedScalingPolicy defines managed scaling for a cluster.

type MonitoringConfiguration added in v1.3.1

type MonitoringConfiguration struct {
	CloudWatchLogConfiguration *CloudWatchLogConfiguration `json:"CloudWatchLogConfiguration,omitempty"`
	S3LoggingConfiguration     *S3LoggingConfiguration     `json:"S3LoggingConfiguration,omitempty"`
}

MonitoringConfiguration is RunJobFlowInput's MonitoringConfiguration, threaded through unchanged and echoed back on Cluster -- gopherstack does not itself publish any logs, so this is stored/returned configuration, not simulated behavior.

type NotebookExecution

type NotebookExecution struct {
	NotebookExecutionID   string `json:"NotebookExecutionId"`
	EditorID              string `json:"EditorId,omitempty"`
	NotebookExecutionName string `json:"NotebookExecutionName,omitempty"`
	NotebookParams        string `json:"NotebookParams,omitempty"`
	ExecutionEngineID     string `json:"executionEngineId,omitempty"`
	Status                string `json:"Status"`

	Tags      []Tag   `json:"Tags"`
	StartTime float64 `json:"StartTime,omitempty"`
	EndTime   float64 `json:"EndTime,omitempty"`
	// contains filtered or unexported fields
}

NotebookExecution represents an EMR Studio notebook execution.

StartTime/EndTime are epoch seconds (float64), matching the EMR awsjson1.1 wire format -- the real SDK deserializer parses these with smithytime.ParseEpochSeconds and rejects RFC3339 strings. A zero value (unset) is omitted via omitempty, matching the "not yet ended" case where AWS omits EndTime entirely. ExecutionEngineID's json tag is persistence-only (regionalDTO's plain json.Marshal round-trip, see persistence.go): NotebookExecution itself is never marshaled directly for an HTTP response any more. The real DescribeNotebookExecutionOutput.NotebookExecution nests it under an "ExecutionEngine" object (types.ExecutionEngineConfig{Id,...}, emr@v1.64.4 deserializers.go's "ExecutionEngine" case in awsAwsjson11_deserializeDocumentNotebookExecution) rather than the flat "ExecutionEngineId" this type used to emit directly -- that flat key is only correct for the DIFFERENT, trimmed NotebookExecutionSummary type ListNotebookExecutions returns (deserializers.go's awsAwsjson11_deserializeDocumentNotebookExecutionSummary, which genuinely has "ExecutionEngineId" flat). handler_notebook_executions.go's newNotebookExecutionDetail builds the correctly-nested Describe wire shape from this field instead.

type NotebookExecutionSummary added in v1.3.1

type NotebookExecutionSummary struct {
	NotebookExecutionID   string  `json:"NotebookExecutionId"`
	EditorID              string  `json:"EditorId,omitempty"`
	NotebookExecutionName string  `json:"NotebookExecutionName,omitempty"`
	ExecutionEngineID     string  `json:"ExecutionEngineId,omitempty"`
	Status                string  `json:"Status"`
	StartTime             float64 `json:"StartTime,omitempty"`
	EndTime               float64 `json:"EndTime,omitempty"`
}

NotebookExecutionSummary is the wire shape for ListNotebookExecutions items (types.NotebookExecutionSummary, emr@v1.64.4 types.go:2161): no NotebookParams, no Tags -- both present on the full NotebookExecution that DescribeNotebookExecution returns.

type PersistentAppUI

type PersistentAppUI struct {
	CreatedAt         time.Time
	ID                string `json:"PersistentAppUIId"`
	TargetResourceArn string `json:"TargetResourceArn"`

	RuntimeRoleEnabledCluster bool `json:"RuntimeRoleEnabledCluster"`
	// contains filtered or unexported fields
}

PersistentAppUI represents an EMR persistent application user interface. PersistentAppUI is this backend's internal model, deliberately not marshaled directly: it mixes CreatePersistentAppUIOutput's real shape (PersistentAppUIId/RuntimeRoleEnabledCluster, correct there) with TargetResourceArn, which is a CreatePersistentAppUIInput-only concept -- the real DescribePersistentAppUIOutput.PersistentAppUI (types.PersistentAppUI, emr@v1.64.4 deserializers.go's awsAwsjson11_deserializeDocumentPersistentAppUI case list) has an entirely different field set (AuthorId/CreationTime/ LastModifiedTime/LastStateChangeReason/PersistentAppUIId/ PersistentAppUIStatus/PersistentAppUITypeList/Tags) with neither TargetResourceArn nor RuntimeRoleEnabledCluster at all. See handler_persistent_app_ui.go's newPersistentAppUIDetail for the correctly separated Describe wire shape; handleCreatePersistentAppUI already built its own separate, correct DTO and never used this type's JSON tags.

type PlacementGroupConfig added in v1.2.0

type PlacementGroupConfig struct {
	InstanceRole      string `json:"InstanceRole"`
	PlacementStrategy string `json:"PlacementStrategy,omitempty"`
}

PlacementGroupConfig is the placement group configuration for a single instance role, part of RunJobFlow's Instances.Placement and echoed back on Cluster.PlacementGroups.

type PortRange

type PortRange struct {
	MinRange int `json:"MinRange"`
	MaxRange int `json:"MaxRange"`
}

PortRange defines an inclusive range of port numbers.

type Provider

type Provider struct{}

Provider implements service.Provider for EMR.

func (*Provider) Init

Init initializes the EMR backend and handler.

func (*Provider) Name

func (p *Provider) Name() string

Name returns the provider name.

type ReleaseLabel

type ReleaseLabel struct {
	ReleaseLabel string                    `json:"ReleaseLabel"`
	Applications []ReleaseLabelApplication `json:"Applications,omitempty"`
}

ReleaseLabel holds details about an EMR release label.

type ReleaseLabelApplication

type ReleaseLabelApplication struct {
	Name    string `json:"Name"`
	Version string `json:"Version"`
}

ReleaseLabelApplication is an application listed for a release label.

type RunJobFlowInstances

type RunJobFlowInstances struct {
	Ec2KeyName                     string              `json:"Ec2KeyName,omitempty"`
	Ec2SubnetID                    string              `json:"Ec2SubnetId,omitempty"`
	EmrManagedMasterSecurityGroup  string              `json:"EmrManagedMasterSecurityGroup,omitempty"`
	EmrManagedSlaveSecurityGroup   string              `json:"EmrManagedSlaveSecurityGroup,omitempty"`
	ServiceAccessSecurityGroup     string              `json:"ServiceAccessSecurityGroup,omitempty"`
	InstanceGroups                 []InstanceGroupSpec `json:"InstanceGroups,omitempty"`
	InstanceFleets                 []InstanceFleetSpec `json:"InstanceFleets,omitempty"`
	Ec2SubnetIDs                   []string            `json:"Ec2SubnetIds,omitempty"`
	AdditionalMasterSecurityGroups []string            `json:"AdditionalMasterSecurityGroups,omitempty"`
	AdditionalSlaveSecurityGroups  []string            `json:"AdditionalSlaveSecurityGroups,omitempty"`
	KeepJobFlowAliveWhenNoSteps    bool                `json:"KeepJobFlowAliveWhenNoSteps"`
	TerminationProtected           bool                `json:"TerminationProtected"`
}

RunJobFlowInstances holds the Instances block from a RunJobFlow call.

NOTE: real EMR's JobFlowInstancesConfig has no IamInstanceProfile member -- that attribute is set via the top-level RunJobFlowInput.JobFlowRole field instead (see RunJobFlowParams.JobFlowRole) and echoed back on Cluster.Ec2InstanceAttributes.IamInstanceProfile. An IamInstanceProfile field used to live here, but no real client ever populates it at this nesting level, so it was deleted.

type RunJobFlowParams

type RunJobFlowParams struct {
	KerberosAttributes      *KerberosAttributes      `json:"KerberosAttributes,omitempty"`
	MonitoringConfiguration *MonitoringConfiguration `json:"MonitoringConfiguration,omitempty"`
	AutoTerminationPolicy   *AutoTerminationPolicy   `json:"AutoTerminationPolicy,omitempty"`
	ManagedScalingPolicy    *ManagedScalingPolicy    `json:"ManagedScalingPolicy,omitempty"`
	LogEncryptionKmsKeyID   string                   `json:"LogEncryptionKmsKeyId,omitempty"`
	AmiVersion              string                   `json:"AmiVersion,omitempty"`
	AutoScalingRole         string                   `json:"AutoScalingRole,omitempty"`
	Name                    string                   `json:"Name"`
	ScaleDownBehavior       string                   `json:"ScaleDownBehavior,omitempty"`
	CustomAmiID             string                   `json:"CustomAmiId,omitempty"`
	JobFlowRole             string                   `json:"JobFlowRole,omitempty"`
	RepoUpgradeOnBoot       string                   `json:"RepoUpgradeOnBoot,omitempty"`
	SecurityConfiguration   string                   `json:"SecurityConfiguration,omitempty"`
	ReleaseLabel            string                   `json:"ReleaseLabel"`
	OSReleaseLabel          string                   `json:"OSReleaseLabel,omitempty"`
	ServiceRole             string                   `json:"ServiceRole,omitempty"`
	LogURI                  string                   `json:"LogUri,omitempty"`
	PlacementGroupConfigs   []PlacementGroupConfig   `json:"PlacementGroupConfigs,omitempty"`
	BootstrapActions        []BootstrapActionConfig  `json:"BootstrapActions,omitempty"`
	Steps                   []StepSpec               `json:"Steps,omitempty"`
	StepExecutionRoleArn    string                   `json:"StepExecutionRoleArn,omitempty"`
	Configurations          []Configuration          `json:"Configurations,omitempty"`
	Applications            []Application            `json:"Applications,omitempty"`
	Tags                    []Tag                    `json:"Tags,omitempty"`
	Instances               RunJobFlowInstances      `json:"Instances"`
	StepConcurrencyLevel    int                      `json:"StepConcurrencyLevel,omitempty"`
	EbsRootVolumeSize       int                      `json:"EbsRootVolumeSize,omitempty"`
	EbsRootVolumeIops       int                      `json:"EbsRootVolumeIops,omitempty"`
	EbsRootVolumeThroughput int                      `json:"EbsRootVolumeThroughput,omitempty"`
	VisibleToAllUsers       bool                     `json:"VisibleToAllUsers"`
}

RunJobFlowParams is the full input for creating a new cluster.

type S3LoggingConfiguration added in v1.3.1

type S3LoggingConfiguration struct {
	LogTypeUploadPolicy map[string]string `json:"LogTypeUploadPolicy,omitempty"`
}

S3LoggingConfiguration controls per-log-type S3 upload policy, part of RunJobFlow's MonitoringConfiguration and echoed back on Cluster.

type ScalingAction

type ScalingAction struct {
	SimpleScalingPolicyConfiguration SimpleScalingPolicyConfiguration `json:"SimpleScalingPolicyConfiguration"`
}

ScalingAction defines what to do when a scaling rule fires.

type ScalingRule

type ScalingRule struct {
	Name        string         `json:"Name"`
	Description string         `json:"Description,omitempty"`
	Action      ScalingAction  `json:"Action"`
	Trigger     ScalingTrigger `json:"Trigger"`
}

ScalingRule is a named auto-scaling rule combining action and trigger.

type ScalingTrigger

type ScalingTrigger struct {
	CloudWatchAlarmDefinition CloudWatchAlarmDefinition `json:"CloudWatchAlarmDefinition"`
}

ScalingTrigger wraps a CloudWatch alarm definition.

type SecurityConfigSummary

type SecurityConfigSummary struct {
	Name             string  `json:"Name"`
	CreationDateTime float64 `json:"CreationDateTime"`
}

SecurityConfigSummary is returned by ListSecurityConfigurations. CreationDateTime is epoch seconds (float64); see SecurityConfiguration for why.

type SecurityConfiguration

type SecurityConfiguration struct {
	Name           string `json:"Name"`
	SecurityConfig string `json:"SecurityConfiguration"`

	CreationDateTime float64 `json:"CreationDateTime"`
	// contains filtered or unexported fields
}

SecurityConfiguration stores an EMR security configuration.

CreationDateTime is epoch seconds (float64), matching the EMR awsjson1.1 wire format -- the real SDK deserializer parses CreationDateTime fields with smithytime.ParseEpochSeconds and rejects RFC3339 strings.

type Session added in v1.2.0

type Session struct {
	MonitoringConfiguration     *SessionMonitoringConfiguration `json:"MonitoringConfiguration,omitempty"`
	ID                          string                          `json:"Id"`
	ClusterID                   string                          `json:"ClusterId"`
	ARN                         string                          `json:"Arn"`
	State                       string                          `json:"State"`
	AccountID                   string                          `json:"AccountId,omitempty"`
	Name                        string                          `json:"Name,omitempty"`
	ExecutionRoleArn            string                          `json:"ExecutionRoleArn,omitempty"`
	ReleaseLabel                string                          `json:"ReleaseLabel,omitempty"`
	ServerURL                   string                          `json:"ServerUrl,omitempty"`
	StateChangeReason           string                          `json:"StateChangeReason,omitempty"`
	EngineConfigurations        []Configuration                 `json:"EngineConfigurations,omitempty"`
	Tags                        []Tag                           `json:"Tags"`
	SessionIdleTimeoutInMinutes int64                           `json:"SessionIdleTimeoutInMinutes,omitempty"`
	CreatedAt                   float64                         `json:"CreatedAt"`
	UpdatedAt                   float64                         `json:"UpdatedAt"`
	EndedAt                     float64                         `json:"EndedAt,omitempty"`
	IdleSince                   float64                         `json:"IdleSince,omitempty"`
	StartedAt                   float64                         `json:"StartedAt,omitempty"`
}

Session represents an interactive (Spark Connect) session running on an EMR cluster (types.Session). See sessions.go's package doc comment for the state-model rationale.

CreatedAt/UpdatedAt are always populated once a session exists, so they carry no omitempty (matching Cluster/SecurityConfiguration's convention for "always set" epoch-seconds fields elsewhere in this package). EndedAt/IdleSince/StartedAt are genuine real Timestamp members this backend only sometimes populates (IdleSince/StartedAt are never populated at all -- see sessions.go), so they use omitempty, matching the real optional *time.Time members on types.Session. All are epoch seconds (float64), matching EMR's awsjson1.1 wire format -- see SecurityConfiguration for why.

type SessionCloudWatchLoggingConfiguration added in v1.2.0

type SessionCloudWatchLoggingConfiguration struct {
	LogTypes            map[string][]string `json:"LogTypes,omitempty"`
	EncryptionKeyArn    string              `json:"EncryptionKeyArn,omitempty"`
	LogGroup            string              `json:"LogGroup,omitempty"`
	LogStreamNamePrefix string              `json:"LogStreamNamePrefix,omitempty"`
	Enabled             bool                `json:"Enabled,omitempty"`
}

SessionCloudWatchLoggingConfiguration is the CloudWatch Logs configuration for a session (types.SessionCloudWatchLoggingConfiguration).

type SessionEndpointResult added in v1.2.0

type SessionEndpointResult struct {
	Expiry      time.Time
	Credentials map[string]any
	Endpoint    string
	AuthToken   string
}

SessionEndpointResult is the output of GetSessionEndpoint.

type SessionManagedLoggingConfiguration added in v1.2.0

type SessionManagedLoggingConfiguration struct {
	EncryptionKeyArn string `json:"EncryptionKeyArn,omitempty"`
	Enabled          bool   `json:"Enabled,omitempty"`
}

SessionManagedLoggingConfiguration is the Amazon EMR-managed logging configuration for a session (types.SessionManagedLoggingConfiguration).

type SessionMonitoringConfiguration added in v1.2.0

type SessionMonitoringConfiguration struct {
	CloudWatchLoggingConfiguration *SessionCloudWatchLoggingConfiguration `json:"CloudWatchLoggingConfiguration,omitempty"`
	ManagedLoggingConfiguration    *SessionManagedLoggingConfiguration    `json:"ManagedLoggingConfiguration,omitempty"`
	S3LoggingConfiguration         *SessionS3LoggingConfiguration         `json:"S3LoggingConfiguration,omitempty"`
}

SessionMonitoringConfiguration controls where a session's logs are published (types.SessionMonitoringConfiguration).

type SessionS3LoggingConfiguration added in v1.2.0

type SessionS3LoggingConfiguration struct {
	LogTypes         map[string][]string `json:"LogTypes,omitempty"`
	EncryptionKeyArn string              `json:"EncryptionKeyArn,omitempty"`
	LogURI           string              `json:"LogUri,omitempty"`
	Enabled          bool                `json:"Enabled,omitempty"`
}

SessionS3LoggingConfiguration is the Amazon S3 logging configuration for a session (types.SessionS3LoggingConfiguration).

type Settings

type Settings struct {
	JanitorInterval time.Duration `json:"janitor_interval" env:"EMR_JANITOR_INTERVAL" default:"1m" help:"Janitor tick interval."`                               //nolint:lll // Kong struct tag makes this line long
	TerminatedTTL   time.Duration `json:"terminated_ttl"   env:"EMR_TERMINATED_TTL"   default:"1h" help:"TTL for terminated clusters before they are evicted."` //nolint:lll // Kong struct tag makes this line long
}

Settings holds service-level configuration for the EMR backend. Fields are picked up by the Kong CLI parser when this struct is embedded in the root CLI command.

type SimpleScalingPolicyConfiguration

type SimpleScalingPolicyConfiguration struct {
	AdjustmentType    string `json:"AdjustmentType"`
	ScalingAdjustment int    `json:"ScalingAdjustment"`
	CoolDown          int    `json:"CoolDown,omitempty"`
}

SimpleScalingPolicyConfiguration defines scaling adjustment details.

type StartSessionParams added in v1.2.0

type StartSessionParams struct {
	MonitoringConfiguration     *SessionMonitoringConfiguration
	ClusterID                   string
	Name                        string
	ExecutionRoleArn            string
	EngineConfigurations        []Configuration
	Tags                        []Tag
	SessionIdleTimeoutInMinutes int64
}

StartSessionParams is the input for creating a new session.

type Step

type Step struct {
	ID               string            `json:"Id"`
	Name             string            `json:"Name"`
	HadoopJarStep    StepHadoopJarStep `json:"Config"`
	ActionOnFailure  string            `json:"ActionOnFailure"`
	ExecutionRoleArn string            `json:"ExecutionRoleArn,omitempty"`
	Status           StepStatus        `json:"Status"`
}

Step represents an EMR step attached to a cluster, shared by both DescribeStep (real shape types.Step) and ListSteps' per-item shape (real shape types.StepSummary).

HadoopJarStep is wire-keyed "Config", not "HadoopJarStep": that name is correct for the request-side StepConfig (types.StepConfig, real key "HadoopJarStep", serializers.go's awsAwsjson11_serializeDocumentStepConfig) but the RESPONSE types (types.Step/types.StepSummary) nest the same shape under "Config" (types.HadoopStepConfig, deserializers.go's "Config" case in awsAwsjson11_deserializeDocumentStep/...StepSummary) -- a real client's typed Step.Config/StepSummary.Config was always nil regardless of backend state before this fix.

ExecutionRoleArn is real and non-required, but ONLY on types.Step (deserializers.go's awsAwsjson11_deserializeDocumentStep "ExecutionRoleArn" case) -- types.StepSummary genuinely has no such member (awsAwsjson11_deserializeDocumentStepSummary's case list has none). Since this type is shared by both responses and DescribeStep is where the field matters (sourced from the call-level AddJobFlowStepsInput.ExecutionRoleArn/ RunJobFlowInput.StepExecutionRoleArn, not from the per-step StepConfig), ListSteps also emits it when set: a harmless extra field a real typed client for that op has no slot to decode into, same non-bug class as rds's DBInstance.StorageOptimized.

type StepHadoopJarStep

type StepHadoopJarStep struct {
	Properties map[string]string `json:"Properties,omitempty"`
	Jar        string            `json:"Jar"`
	MainClass  string            `json:"MainClass,omitempty"`
	Args       []string          `json:"Args,omitempty"`
}

StepHadoopJarStep is the RESPONSE-side shape (types.HadoopStepConfig) for a step's Hadoop JAR execution -- see StepHadoopJarStepInput's doc comment for why Properties differs in shape from the request side. Previously had no Properties member at all, so a real client's per-step Hadoop job properties were silently dropped on input and never echoed back.

type StepHadoopJarStepInput added in v1.3.1

type StepHadoopJarStepInput struct {
	Jar        string     `json:"Jar"`
	MainClass  string     `json:"MainClass,omitempty"`
	Args       []string   `json:"Args,omitempty"`
	Properties []KeyValue `json:"Properties,omitempty"`
}

StepHadoopJarStepInput is the REQUEST-side shape (types.HadoopJarStepConfig) for a step's Hadoop JAR execution, used by StepSpec (RunJobFlow/ AddJobFlowSteps' Steps input). Properties is genuinely a JSON ARRAY of {Key,Value} objects on this side (serializers.go's awsAwsjson11_serializeDocumentKeyValueList) -- asymmetric with the RESPONSE side (StepHadoopJarStep.Properties below), which the real API represents as a plain string map (types.HadoopStepConfig, StringMap shape). A real EMR wire quirk, confirmed independently against both serializers.go and deserializers.go, not a gopherstack inconsistency.

type StepSpec

type StepSpec struct {
	Name            string                 `json:"Name"`
	ActionOnFailure string                 `json:"ActionOnFailure"`
	HadoopJarStep   StepHadoopJarStepInput `json:"HadoopJarStep"`
}

StepSpec is the input for adding a new step.

type StepStatus

type StepStatus struct {
	State    string       `json:"State"`
	Timeline StepTimeline `json:"Timeline"`
}

StepStatus holds the lifecycle state of an EMR step.

type StepTimeline

type StepTimeline struct {
	CreationDateTime float64 `json:"CreationDateTime"`
	StartDateTime    float64 `json:"StartDateTime,omitempty"`
	EndDateTime      float64 `json:"EndDateTime,omitempty"`
}

StepTimeline tracks creation and completion times of a step.

type Studio

type Studio struct {
	EngineSecurityGroupID      string `json:"EngineSecurityGroupId"`
	VpcID                      string `json:"VpcId"`
	StudioID                   string `json:"StudioId"`
	EncryptionKeyArn           string `json:"EncryptionKeyArn,omitempty"`
	Name                       string `json:"Name"`
	Description                string `json:"Description,omitempty"`
	AuthMode                   string `json:"AuthMode"`
	DefaultS3Location          string `json:"DefaultS3Location"`
	ServiceRole                string `json:"ServiceRole"`
	IdcInstanceArn             string `json:"IdcInstanceArn,omitempty"`
	IdcUserAssignment          string `json:"IdcUserAssignment,omitempty"`
	URL                        string `json:"Url"`
	WorkspaceSecurityGroupID   string `json:"WorkspaceSecurityGroupId"`
	StudioArn                  string `json:"StudioArn"`
	UserRole                   string `json:"UserRole,omitempty"`
	IdpAuthURL                 string `json:"IdpAuthUrl,omitempty"`
	IdpRelayStateParameterName string `json:"IdpRelayStateParameterName,omitempty"`

	Tags                              []Tag    `json:"Tags"`
	SubnetIDs                         []string `json:"SubnetIds"`
	CreationTime                      float64  `json:"CreationTime,omitempty"`
	TrustedIdentityPropagationEnabled bool     `json:"TrustedIdentityPropagationEnabled"`
	// contains filtered or unexported fields
}

Studio represents an EMR Studio.

CreationTime is epoch seconds (float64), matching the EMR awsjson1.1 wire format -- the real SDK deserializer parses CreationTime with smithytime.ParseEpochSeconds and rejects RFC3339 strings.

type StudioSessionMapping

type StudioSessionMapping struct {
	StudioID         string `json:"StudioId"`
	IdentityType     string `json:"IdentityType"`
	IdentityID       string `json:"IdentityId,omitempty"`
	IdentityName     string `json:"IdentityName,omitempty"`
	SessionPolicyArn string `json:"SessionPolicyArn"`

	LastModifiedTime float64 `json:"LastModifiedTime,omitempty"`
	CreationTime     float64 `json:"CreationTime,omitempty"`
	// contains filtered or unexported fields
}

StudioSessionMapping maps a user or group to an EMR Studio. CreationTime/LastModifiedTime are epoch seconds (float64); see Studio for why.

type StudioSummary

type StudioSummary struct {
	StudioID     string  `json:"StudioId"`
	Name         string  `json:"Name"`
	VpcID        string  `json:"VpcId"`
	AuthMode     string  `json:"AuthMode"`
	URL          string  `json:"Url"`
	Description  string  `json:"Description,omitempty"`
	CreationTime float64 `json:"CreationTime,omitempty"`
}

StudioSummary is a trimmed view of Studio for ListStudios. CreationTime is epoch seconds (float64); see Studio for why.

StudioArn/DefaultS3Location were previously listed here but deleted: the real types.StudioSummary (emr@v1.64.4 deserializers.go's awsAwsjson11_deserializeDocumentStudioSummary case list) has no such members at all (only AuthMode/CreationTime/Description/Name/StudioId/Url/ VpcId) -- both were invented fields, not omissions. Harmless (a real client's typed StudioSummary has no field to decode either into), but incorrect.

type SupportedInstanceType

type SupportedInstanceType struct {
	Type          string  `json:"Type"`
	Architecture  string  `json:"Architecture"`
	MemoryGB      float64 `json:"MemoryGB"`
	VCPU          int     `json:"VCPU"`
	NumberOfDisks int     `json:"NumberOfDisks,omitempty"`
	Is64BitsOnly  bool    `json:"Is64BitsOnly"`
}

SupportedInstanceType describes an EC2 instance type supported by EMR.

type Tag

type Tag struct {
	Key   string `json:"Key"`
	Value string `json:"Value"`
}

Tag is an EMR resource tag.

type TaggedEntry added in v1.2.0

type TaggedEntry struct {
	Tags map[string]string
	ARN  string
}

TaggedEntry pairs a resource ARN with its tag map, for cross-service tag enumeration by the Resource Groups Tagging API (see cli.go's wireTaggingEMR).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL