Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit ff3c4ba

Browse files
committedFeb 6, 2025·
Seed Usage Event records
Useful for integration testing. May only be needed while validating Usage Consumer feature.
1 parent f24995f commit ff3c4ba

File tree

2 files changed

+213
-0
lines changed

2 files changed

+213
-0
lines changed
 

‎db/seeds/usage_events.rb

+197
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
require_relative '../../spec/support/fakes/blueprints'
2+
3+
module VCAP::CloudController
4+
FIXED_ORGS = [
5+
{ name: 'sales-org', guid: Sham.guid },
6+
{ name: 'engineering-org', guid: Sham.guid },
7+
{ name: 'marketing-org', guid: Sham.guid }
8+
].freeze
9+
10+
FIXED_SPACES = FIXED_ORGS.map do |org|
11+
[
12+
{ name: "#{org[:name]}-dev", guid: Sham.guid, org: org },
13+
{ name: "#{org[:name]}-staging", guid: Sham.guid, org: org },
14+
{ name: "#{org[:name]}-prod", guid: Sham.guid, org: org }
15+
]
16+
end.flatten
17+
18+
BUILDPACKS = {
19+
'ruby_buildpack' => Sham.guid,
20+
'nodejs_buildpack' => Sham.guid,
21+
'go_buildpack' => Sham.guid
22+
}.freeze
23+
24+
SERVICE_PLANS = {
25+
'small' => Sham.guid,
26+
'medium' => Sham.guid,
27+
'large' => Sham.guid,
28+
'premium' => Sham.guid
29+
}.freeze
30+
31+
SERVICE_BROKERS = {
32+
'aws-service-broker' => Sham.guid,
33+
'gcp-service-broker' => Sham.guid,
34+
'azure-service-broker' => Sham.guid
35+
}.freeze
36+
37+
SERVICES = {
38+
'postgresql' => Sham.guid,
39+
'redis' => Sham.guid,
40+
'rabbitmq' => Sham.guid,
41+
'mongodb' => Sham.guid
42+
}.freeze
43+
44+
SERVICE_INSTANCE_TYPES = %w[
45+
managed_service_instance
46+
user_provided_service_instance
47+
].freeze
48+
49+
SERVICE_INSTANCE_NAMES = {
50+
'postgresql' => %w[users-db orders-db inventory-db],
51+
'redis' => %w[session-cache api-cache queue-cache],
52+
'rabbitmq' => %w[event-queue worker-queue notification-queue],
53+
'mongodb' => %w[analytics-store metrics-store logs-store]
54+
}.freeze
55+
56+
APP_NAMES = {
57+
'frontend-ui' => Sham.guid,
58+
'backend-api' => Sham.guid,
59+
'auth-service' => Sham.guid,
60+
'payment-processor' => Sham.guid,
61+
'notification-service' => Sham.guid,
62+
'user-service' => Sham.guid,
63+
'order-service' => Sham.guid,
64+
'inventory-service' => Sham.guid,
65+
'search-service' => Sham.guid,
66+
'analytics-service' => Sham.guid
67+
}.freeze
68+
69+
CURRENT_TIME = Time.new(2025, 1, 10, 9, 0, 0)
70+
THREE_DAYS_AGO = CURRENT_TIME - 3.days
71+
TWO_YEARS_AGO = CURRENT_TIME - (2 * 365 * 24 * 3600)
72+
73+
def self.generate_stop_time(start_time)
74+
max_possible_hours = ((CURRENT_TIME - start_time) / 3600).floor
75+
min_hours = 20
76+
max_hours = [600, max_possible_hours].min
77+
78+
hours_to_add = if max_possible_hours < min_hours
79+
max_possible_hours
80+
else
81+
rand(min_hours..max_hours)
82+
end
83+
84+
start_time + hours_to_add.hours
85+
end
86+
87+
app_events_to_create = []
88+
89+
100.times do
90+
space = FIXED_SPACES.sample
91+
buildpack_name = BUILDPACKS.keys.sample
92+
app_name = APP_NAMES.keys.sample
93+
app_guid = Sham.guid
94+
95+
common_app_attrs = {
96+
memory_in_mb_per_instance: [128, 256, 512, 1024].sample,
97+
previous_memory_in_mb_per_instance: nil,
98+
instance_count: rand(1..10),
99+
previous_instance_count: nil,
100+
process_type: 'web',
101+
parent_app_guid: APP_NAMES[app_name],
102+
parent_app_name: app_name,
103+
app_guid: app_guid,
104+
app_name: app_name,
105+
space_name: space[:name],
106+
space_guid: space[:guid],
107+
org_guid: space[:org][:guid],
108+
buildpack_guid: BUILDPACKS[buildpack_name],
109+
buildpack_name: buildpack_name,
110+
package_state: 'STAGED',
111+
previous_package_state: nil,
112+
task_guid: nil,
113+
task_name: nil,
114+
previous_state: nil
115+
}
116+
117+
start_time = Time.at(rand(TWO_YEARS_AGO.to_i..THREE_DAYS_AGO.to_i))
118+
stop_time = generate_stop_time(start_time)
119+
120+
started_event = {
121+
attributes: common_app_attrs.merge(
122+
state: 'STARTED',
123+
created_at: start_time
124+
),
125+
created_at: start_time
126+
}
127+
128+
stopped_event = {
129+
attributes: common_app_attrs.merge(
130+
state: 'STOPPED',
131+
previous_state: 'STARTED',
132+
created_at: stop_time
133+
),
134+
created_at: stop_time
135+
}
136+
137+
app_events_to_create.push(started_event, stopped_event)
138+
end
139+
140+
service_events_to_create = []
141+
142+
100.times do
143+
space = FIXED_SPACES.sample
144+
service_plan_name = SERVICE_PLANS.keys.sample
145+
service_broker_name = SERVICE_BROKERS.keys.sample
146+
service_label = SERVICES.keys.sample
147+
service_instance_type = SERVICE_INSTANCE_TYPES.sample
148+
service_instance_name = SERVICE_INSTANCE_NAMES[service_label].sample
149+
service_instance_guid = Sham.guid
150+
151+
common_service_attrs = {
152+
space_name: space[:name],
153+
space_guid: space[:guid],
154+
org_guid: space[:org][:guid],
155+
service_instance_guid: service_instance_guid,
156+
service_instance_name: service_instance_name,
157+
service_instance_type: service_instance_type,
158+
service_plan_guid: SERVICE_PLANS[service_plan_name],
159+
service_plan_name: service_plan_name,
160+
service_guid: SERVICES[service_label],
161+
service_label: service_label,
162+
service_broker_guid: SERVICE_BROKERS[service_broker_name],
163+
service_broker_name: service_broker_name
164+
}
165+
166+
creation_time = Time.at(rand(TWO_YEARS_AGO.to_i..THREE_DAYS_AGO.to_i))
167+
deletion_time = generate_stop_time(creation_time)
168+
169+
created_event = {
170+
attributes: common_service_attrs.merge(
171+
state: 'CREATED',
172+
created_at: creation_time
173+
),
174+
created_at: creation_time
175+
}
176+
177+
deleted_event = {
178+
attributes: common_service_attrs.merge(
179+
state: 'DELETED',
180+
created_at: deletion_time
181+
),
182+
created_at: deletion_time
183+
}
184+
185+
service_events_to_create.push(created_event, deleted_event)
186+
end
187+
188+
events = (app_events_to_create + service_events_to_create).sort_by { |e| e[:created_at] }
189+
190+
events.each do |event|
191+
if event[:attributes][:service_instance_guid]
192+
ServiceUsageEvent.make(**event[:attributes])
193+
else
194+
AppUsageEvent.make(**event[:attributes])
195+
end
196+
end
197+
end

‎lib/tasks/usage_events.rake

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace :db do
2+
desc 'Seed usage events'
3+
task seed_usage_events: :environment do
4+
$LOAD_PATH.unshift(File.expand_path('../../spec', __dir__))
5+
6+
require 'machinist/sequel'
7+
require 'machinist/object'
8+
require 'support/bootstrap/spec_bootstrap'
9+
10+
# Initialize the test environment
11+
VCAP::CloudController::SpecBootstrap.init
12+
13+
require File.expand_path('../../db/seeds/usage_events', __dir__)
14+
puts 'Created seed usage events'
15+
end
16+
end

0 commit comments

Comments
 (0)
Please sign in to comment.