Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion cmd/multi_service_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -537,10 +537,13 @@ func applyRegionFilters(
func applyCoverageAndOverrides(recs []common.Recommendation, cfg Config, coverageMap recommendations.PoolCoverageMap, expiringCommitments []common.Commitment, drops *common.DropSummary) []common.Recommendation {
recommendations.ApplyCoverageMapToRecommendations(recs, coverageMap)
if cfg.RebuyWindowDays > 0 && len(expiringCommitments) > 0 {
n := recommendations.AdjustExistingCoverageForExpiringCommitments(recs, expiringCommitments, cfg.RebuyWindowDays)
n, missingDemand := recommendations.AdjustExistingCoverageForExpiringCommitmentsWithCoverage(recs, expiringCommitments, cfg.RebuyWindowDays, coverageMap)
if n > 0 {
AppLogger.Printf(" ⏰ Treating %d recs as partially uncovered (RIs expiring within %d days)\n", n, cfg.RebuyWindowDays)
}
if missingDemand > 0 {
AppLogger.Printf(" ⚠️ Skipped expiry adjustment for %d recommendations because pool demand was unavailable; coverage was left unchanged\n", missingDemand)
}
}
// Family-NU sizing for RDS recs: AWS rec API already bundles size-flex
// demand within a family into one rec at one size, so per-pool sizing
Expand Down
33 changes: 23 additions & 10 deletions cmd/recommendation_completeness_proxy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,18 @@ import (
)

type completenessProxy struct {
t *testing.T
mu sync.Mutex
handlers sync.WaitGroup
regions string
details string
service string
requests map[string]int
spRequests []completenessSPRequest
engines []string
cert tls.Certificate
t *testing.T
mu sync.Mutex
handlers sync.WaitGroup
regions string
details string
service string
requests map[string]int
spRequests []completenessSPRequest
engines []string
cert tls.Certificate
expiryCoverage []string
expiryAccounts []string
}

type completenessSPRequest struct {
Expand All @@ -60,6 +62,9 @@ func newCompletenessProxy(t *testing.T, dir, regions, details, service string) (
KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment,
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
}
if service == "ec2" {
template.DNSNames = append(template.DNSNames, "organizations.us-east-1.amazonaws.com")
}
der, err := x509.CreateCertificate(rand.Reader, template, template, &key.PublicKey, key)
require.NoError(t, err)
certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: der})
Expand All @@ -79,6 +84,7 @@ func (p *completenessProxy) serveConnect(w http.ResponseWriter, r *http.Request)
p.handlers.Add(1)
defer p.handlers.Done()
allowed := r.Host == "ce.us-east-1.amazonaws.com:443" || r.Host == "ec2.us-east-1.amazonaws.com:443" || r.Host == "rds.us-east-1.amazonaws.com:443" || r.Host == "savingsplans.amazonaws.com:443"
allowed = allowed || (p.service == "ec2" && r.Host == "organizations.us-east-1.amazonaws.com:443")
if r.Method != http.MethodConnect || !allowed {
p.t.Errorf("unexpected CONNECT %s %s", r.Method, r.Host)
http.Error(w, "forbidden", http.StatusForbidden)
Expand Down Expand Up @@ -133,6 +139,9 @@ func (p *completenessProxy) respond(req *http.Request) *http.Response {
if err != nil {
p.t.Error(err)
}
if p.service == "ec2" {
return p.respondReservationExpiry(req, body)
}
op := req.Header.Get("X-Amz-Target")
if req.Host == "savingsplans.amazonaws.com" && op == "" {
op = strings.TrimPrefix(req.URL.Path, "/")
Expand Down Expand Up @@ -240,6 +249,10 @@ func (p *completenessProxy) assertRequests(t *testing.T) {
p.handlers.Wait()
p.mu.Lock()
defer p.mu.Unlock()
if p.service == "ec2" {
p.assertReservationExpiryRequests(t)
return
}
if p.service != "rds" {
p.assertSPRequests(t)
return
Expand Down
11 changes: 9 additions & 2 deletions cmd/recommendation_completeness_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ func runCompletenessScenario(t *testing.T, service, regionMode, details string)
"CUDLY_COMPLETENESS_AUDIT=" + filepath.Join(dir, "audit.jsonl"),
"CUDLY_COMPLETENESS_REGIONS=" + regionMode,
"CUDLY_COMPLETENESS_SERVICE=" + service,
"CUDLY_COMPLETENESS_DETAILS=" + details,
"AWS_ACCESS_KEY_ID=synthetic", "AWS_SECRET_ACCESS_KEY=synthetic", "AWS_REGION=us-east-1",
"AWS_EC2_METADATA_DISABLED=true", "AWS_MAX_ATTEMPTS=1",
"AWS_CONFIG_FILE=" + filepath.Join(dir, "absent-config"),
Expand All @@ -72,10 +73,13 @@ func runCompletenessScenario(t *testing.T, service, regionMode, details string)
for _, failure := range []string{"Could not check", "Failed to query", "request send failed", "certificate", "TLS handshake"} {
require.NotContains(t, logs, failure, "unexpected ancillary error")
}
if service == "rds" {
switch service {
case "ec2":
assertReservationExpiryCSV(t, output, details, logs)
case "rds":
assertCompletenessDiagnostics(t, regionMode, details, stdout.String(), stderr.String())
assertCompletenessCSV(t, output, details, logs)
} else {
default:
assertSPCompleteness(t, output, service, details, logs)
}
}
Expand All @@ -95,6 +99,9 @@ func runCompletenessCommandChild(t *testing.T) {
if os.Getenv("CUDLY_COMPLETENESS_REGIONS") == "explicit" {
args = append(args, "--regions", "us-east-1")
}
if os.Getenv("CUDLY_COMPLETENESS_SERVICE") == "ec2" {
args = append(args, reservationExpiryArgs(os.Getenv("CUDLY_COMPLETENESS_DETAILS"))...)
}
rootCmd.SetArgs(args)
require.NoError(t, rootCmd.Execute())
}
Expand Down
Loading
Loading