fix(provision): reconcile channel pricing and hosted access
This commit is contained in:
@@ -199,7 +199,7 @@ func (s *ImportService) Import(ctx context.Context, req ImportRequest) (report I
|
||||
}
|
||||
|
||||
func (s *ImportService) ensureManagedResources(ctx context.Context, provider pack.ProviderManifest, accessMode string) (resolvedManagedResources, error) {
|
||||
names := SuggestResourceNames(provider)
|
||||
names := SuggestResourceNamesForMode(provider, accessMode)
|
||||
snapshot, err := s.host.ListManagedResources(ctx, sub2api.ListManagedResourcesRequest{
|
||||
GroupName: names.Group,
|
||||
ChannelName: names.Channel,
|
||||
@@ -210,14 +210,14 @@ func (s *ImportService) ensureManagedResources(ctx context.Context, provider pac
|
||||
}
|
||||
|
||||
result := resolvedManagedResources{}
|
||||
group, created, err := ensureGroup(ctx, s.host, snapshot.Groups, provider, accessMode)
|
||||
group, created, err := ensureGroup(ctx, s.host, snapshot.Groups, provider, accessMode, names.Group)
|
||||
if err != nil {
|
||||
return resolvedManagedResources{}, fmt.Errorf("ensure group: %w", err)
|
||||
}
|
||||
result.Group = group
|
||||
result.CreatedGroup = created
|
||||
|
||||
channel, created, err := ensureChannel(ctx, s.host, snapshot.Channels, provider, group.ID)
|
||||
channel, created, err := ensureChannel(ctx, s.host, snapshot.Channels, provider, group.ID, names.Channel)
|
||||
if err != nil {
|
||||
return resolvedManagedResources{}, fmt.Errorf("ensure channel: %w", err)
|
||||
}
|
||||
@@ -225,7 +225,7 @@ func (s *ImportService) ensureManagedResources(ctx context.Context, provider pac
|
||||
result.CreatedChannel = created
|
||||
|
||||
if accessMode == AccessModeSubscription {
|
||||
plan, created, err := ensurePlan(ctx, s.host, snapshot.Plans, provider, group.ID)
|
||||
plan, created, err := ensurePlan(ctx, s.host, snapshot.Plans, provider, group.ID, names.Plan)
|
||||
if err != nil {
|
||||
return resolvedManagedResources{}, fmt.Errorf("ensure plan: %w", err)
|
||||
}
|
||||
@@ -236,10 +236,10 @@ func (s *ImportService) ensureManagedResources(ctx context.Context, provider pac
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func ensureGroup(ctx context.Context, host hostAdapter, existing []sub2api.NamedResource, provider pack.ProviderManifest, accessMode string) (sub2api.GroupRef, bool, error) {
|
||||
func ensureGroup(ctx context.Context, host hostAdapter, existing []sub2api.NamedResource, provider pack.ProviderManifest, accessMode, groupName string) (sub2api.GroupRef, bool, error) {
|
||||
switch len(existing) {
|
||||
case 0:
|
||||
groupReq := sub2api.CreateGroupRequest{Name: provider.GroupTemplate.Name, Platform: provider.Platform, RateMultiplier: provider.GroupTemplate.RateMultiplier}
|
||||
groupReq := sub2api.CreateGroupRequest{Name: groupName, Platform: provider.Platform, RateMultiplier: provider.GroupTemplate.RateMultiplier}
|
||||
if accessMode == AccessModeSubscription {
|
||||
groupReq.SubscriptionType = "subscription"
|
||||
}
|
||||
@@ -248,38 +248,52 @@ func ensureGroup(ctx context.Context, host hostAdapter, existing []sub2api.Named
|
||||
case 1:
|
||||
return sub2api.GroupRef{ID: existing[0].ID, Name: existing[0].Name}, false, nil
|
||||
default:
|
||||
return sub2api.GroupRef{}, false, fmt.Errorf("multiple groups already exist for %q", provider.GroupTemplate.Name)
|
||||
return sub2api.GroupRef{}, false, fmt.Errorf("multiple groups already exist for %q", groupName)
|
||||
}
|
||||
}
|
||||
|
||||
func ensureChannel(ctx context.Context, host hostAdapter, existing []sub2api.NamedResource, provider pack.ProviderManifest, groupID string) (sub2api.ChannelRef, bool, error) {
|
||||
func ensureChannel(ctx context.Context, host hostAdapter, existing []sub2api.NamedResource, provider pack.ProviderManifest, groupID, channelName string) (sub2api.ChannelRef, bool, error) {
|
||||
channelReq := buildChannelRequest(provider, groupID, channelName)
|
||||
switch len(existing) {
|
||||
case 0:
|
||||
channelReq := sub2api.CreateChannelRequest{
|
||||
Name: provider.ChannelTemplate.Name,
|
||||
GroupIDs: []string{groupID},
|
||||
ModelMapping: provider.ChannelTemplate.ModelMapping,
|
||||
RestrictModels: true,
|
||||
BillingModelSource: "channel_mapped",
|
||||
}
|
||||
channel, err := host.CreateChannel(ctx, channelReq)
|
||||
return channel, true, err
|
||||
case 1:
|
||||
if err := host.UpdateChannel(ctx, existing[0].ID, channelReq); err != nil {
|
||||
return sub2api.ChannelRef{}, false, err
|
||||
}
|
||||
return sub2api.ChannelRef{ID: existing[0].ID, Name: existing[0].Name}, false, nil
|
||||
default:
|
||||
return sub2api.ChannelRef{}, false, fmt.Errorf("multiple channels already exist for %q", provider.ChannelTemplate.Name)
|
||||
return sub2api.ChannelRef{}, false, fmt.Errorf("multiple channels already exist for %q", channelName)
|
||||
}
|
||||
}
|
||||
|
||||
func ensurePlan(ctx context.Context, host hostAdapter, existing []sub2api.NamedResource, provider pack.ProviderManifest, groupID string) (sub2api.PlanRef, bool, error) {
|
||||
func buildChannelRequest(provider pack.ProviderManifest, groupID, channelName string) sub2api.CreateChannelRequest {
|
||||
return sub2api.CreateChannelRequest{
|
||||
Name: channelName,
|
||||
GroupIDs: []string{groupID},
|
||||
ModelMapping: provider.ChannelTemplate.ModelMapping,
|
||||
ModelPricing: []sub2api.ChannelModelPricing{{
|
||||
Platform: provider.Platform,
|
||||
Models: append([]string(nil), provider.DefaultModels...),
|
||||
BillingMode: "token",
|
||||
Intervals: []sub2api.ChannelPricingTier{},
|
||||
}},
|
||||
Platform: provider.Platform,
|
||||
RestrictModels: true,
|
||||
BillingModelSource: "channel_mapped",
|
||||
}
|
||||
}
|
||||
|
||||
func ensurePlan(ctx context.Context, host hostAdapter, existing []sub2api.NamedResource, provider pack.ProviderManifest, groupID, planName string) (sub2api.PlanRef, bool, error) {
|
||||
switch len(existing) {
|
||||
case 0:
|
||||
plan, err := host.CreatePlan(ctx, sub2api.CreatePlanRequest{GroupID: groupID, Name: provider.PlanTemplate.Name, Price: provider.PlanTemplate.Price, ValidityDays: provider.PlanTemplate.ValidityDays, ValidityUnit: provider.PlanTemplate.ValidityUnit})
|
||||
plan, err := host.CreatePlan(ctx, sub2api.CreatePlanRequest{GroupID: groupID, Name: planName, Price: provider.PlanTemplate.Price, ValidityDays: provider.PlanTemplate.ValidityDays, ValidityUnit: provider.PlanTemplate.ValidityUnit})
|
||||
return plan, true, err
|
||||
case 1:
|
||||
return sub2api.PlanRef{ID: existing[0].ID, Name: existing[0].Name}, false, nil
|
||||
default:
|
||||
return sub2api.PlanRef{}, false, fmt.Errorf("multiple plans already exist for %q", provider.PlanTemplate.Name)
|
||||
return sub2api.PlanRef{}, false, fmt.Errorf("multiple plans already exist for %q", planName)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -329,8 +343,9 @@ func buildBatchAccountsRequest(provider pack.ProviderManifest, groupID string, k
|
||||
Type: provider.AccountType,
|
||||
GroupIDs: []string{groupID},
|
||||
Credentials: map[string]any{
|
||||
"base_url": provider.BaseURL,
|
||||
"api_key": key,
|
||||
"base_url": provider.BaseURL,
|
||||
"api_key": key,
|
||||
"model_mapping": provider.ChannelTemplate.ModelMapping,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user