Route license files through UploadLicenseService and stop fabricating add-on purchases

What

Applies a licence file through GitlabSubscriptions::UploadLicenseService instead of saving the License model directly, and removes the add-on step's fallback to AddOnPurchases::CreateService.

Closes #7 (closed).

Why

The direct save skips update_add_on_purchases, the service's only behavioural addition, so an offline cloud licence's add_on_products never becomes AddOnPurchase rows at upload time. The add-on step covered for that by creating a purchase, which meant the harness supplied the answer a licensing or Duo scenario is there to measure.

A missing purchase is now reported: the command prints the licence type, what the licence carried, what was provisioned, and that the two disagree. The step stays non-fatal, so Geo, airgap and source-dev runs are unaffected and the licence is still recorded.

Contract change

The service refuses online cloud licences, which the previous path accepted. Those belong on the activation-code path; the command detects the case and says so rather than falling back to the bypass.

Also

drift-check gains asserts for the eight upstream symbols the new path depends on, since a rename would degrade quietly into the old behaviour. gce.md and SKILL.md described the removed create path.

Testing

just -f skills/gitlab-simulation/justfile ci passes; just sims-check passes; just drift-check reports 41/0 against master, with the new asserts also passing against v19.3.1-ee. Not re-run against a live VM in this change; the behavioural claim rests on a controlled run on omnibus 19.3.1-ee where the application path was the only variable.

Merge request reports

Loading
Loading