Some checks failed
PR Fast Feedback / fast-feedback (pull_request) Failing after 4m7s
Implemented deterministic Baseline Result Semantics (Spec 383), introducing CompareSubjectResult and CompareEvidenceResult. Replaced generic arrays with strict Data Transfer Objects for Baseline engine output.
97 lines
3.8 KiB
PHP
97 lines
3.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Services\Baselines\Matching;
|
|
|
|
use App\Support\Baselines\BaselineSupportCapabilityGuard;
|
|
use App\Support\Inventory\InventoryPolicyTypeMeta;
|
|
use App\Support\Resources\ResourceIdentity;
|
|
|
|
final readonly class FoundationCoverageResolver
|
|
{
|
|
public function __construct(
|
|
private BaselineSupportCapabilityGuard $capabilityGuard,
|
|
) {}
|
|
|
|
/**
|
|
* @return array{
|
|
* policy_type: string,
|
|
* coverage: string,
|
|
* compare_capability: string,
|
|
* capture_capability: string,
|
|
* source_model_expected: ?string,
|
|
* support_mode: string,
|
|
* reason_code: ?string,
|
|
* identity_kind: ?string
|
|
* }
|
|
*/
|
|
public function coverageFor(string $policyType, ?ResourceIdentity $identity = null): array
|
|
{
|
|
$capability = $this->capabilityGuard->inspectType($policyType);
|
|
$supportMode = $capability->supportModeFor('compare');
|
|
$identityKind = $identity?->identityKind;
|
|
$isFoundation = InventoryPolicyTypeMeta::isFoundation($policyType);
|
|
|
|
if ($supportMode === 'invalid_support_config') {
|
|
return $this->record($policyType, 'unsupported', $capability->compareCapability, $capability->captureCapability, $capability->sourceModelExpected, $supportMode, 'invalid_support_config', $identityKind);
|
|
}
|
|
|
|
if ($supportMode === 'excluded') {
|
|
return $this->record($policyType, 'unsupported', $capability->compareCapability, $capability->captureCapability, $capability->sourceModelExpected, $supportMode, 'unsupported_resource_class', $identityKind);
|
|
}
|
|
|
|
if ($identity instanceof ResourceIdentity && in_array($identity->identityKind, [
|
|
ResourceIdentity::CanonicalBuiltin,
|
|
ResourceIdentity::CanonicalDefault,
|
|
ResourceIdentity::CanonicalVirtualTarget,
|
|
], true)) {
|
|
return $this->record($policyType, 'canonical_only', $capability->compareCapability, $capability->captureCapability, $capability->sourceModelExpected, $supportMode, 'foundation_canonical_only', $identityKind);
|
|
}
|
|
|
|
if ($isFoundation && $capability->sourceModelExpected === 'inventory') {
|
|
return $this->record($policyType, 'inventory_only', $capability->compareCapability, $capability->captureCapability, $capability->sourceModelExpected, $supportMode, 'foundation_inventory_only', $identityKind);
|
|
}
|
|
|
|
if ($supportMode === 'limited') {
|
|
return $this->record($policyType, 'identity_only', $capability->compareCapability, $capability->captureCapability, $capability->sourceModelExpected, $supportMode, 'foundation_identity_only', $identityKind);
|
|
}
|
|
|
|
return $this->record($policyType, 'fully_comparable', $capability->compareCapability, $capability->captureCapability, $capability->sourceModelExpected, $supportMode, null, $identityKind);
|
|
}
|
|
|
|
/**
|
|
* @return array{
|
|
* policy_type: string,
|
|
* coverage: string,
|
|
* compare_capability: string,
|
|
* capture_capability: string,
|
|
* source_model_expected: ?string,
|
|
* support_mode: string,
|
|
* reason_code: ?string,
|
|
* identity_kind: ?string
|
|
* }
|
|
*/
|
|
private function record(
|
|
string $policyType,
|
|
string $coverage,
|
|
string $compareCapability,
|
|
string $captureCapability,
|
|
?string $sourceModelExpected,
|
|
string $supportMode,
|
|
?string $reasonCode,
|
|
?string $identityKind,
|
|
): array {
|
|
return [
|
|
'policy_type' => $policyType,
|
|
'coverage' => $coverage,
|
|
'compare_capability' => $compareCapability,
|
|
'capture_capability' => $captureCapability,
|
|
'source_model_expected' => $sourceModelExpected,
|
|
'support_mode' => $supportMode,
|
|
'reason_code' => $reasonCode,
|
|
'identity_kind' => $identityKind,
|
|
];
|
|
}
|
|
}
|