Skip to content

Commit

Permalink
Enable mock by default for dev licenses (#54)
Browse files Browse the repository at this point in the history
  • Loading branch information
sgalsaleh authored Jul 14, 2023
1 parent 262c791 commit 59ee6df
Show file tree
Hide file tree
Showing 6 changed files with 150 additions and 80 deletions.
5 changes: 3 additions & 2 deletions chart/templates/replicated-secret.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ stringData:
{{- if (.Values.integration).licenseID }}
REPLICATED_INTEGRATION_LICENSE_ID: {{ .Values.integration.licenseID }}
{{- end }}
{{- if ((.Values.integration).mock).enabled }}
REPLICATED_MOCK_ENABLED: "{{ .Values.integration.mock.enabled }}"
# kindIs "invalid" indicates that the value is nil and the user did not provide a value
{{- if not (kindIs "invalid" ((.Values.integration).mock).enabled) }}
REPLICATED_MOCK_ENABLED: "{{ ((.Values.integration).mock).enabled }}"
{{- end }}
{{- if ((.Values.integration).mock).data }}
REPLICATED_MOCK_DATA: {{- .Values.integration.mock.data | toYaml | indent 1 }}
Expand Down
2 changes: 1 addition & 1 deletion chart/values.yaml.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,5 @@ service:
integration:
licenseID: ""
mock:
enabled: false
# enabled: false
data: ""
2 changes: 1 addition & 1 deletion pkg/apiserver/bootstrap.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func bootstrap(params APIServerParams) error {
mock.InitMock(clientset, store.GetStore().GetNamespace())
}

isMockEnabled, err := mock.MustGetMock().IsMockEnabled(params.Context)
isMockEnabled, err := mock.MustGetMock().IsMockEnabled(params.Context, store.GetStore().GetLicense())
if err != nil {
return errors.Wrap(err, "failed to check if mock is enabled")
}
Expand Down
136 changes: 65 additions & 71 deletions pkg/handlers/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,41 +42,39 @@ type AppRelease struct {
}

func GetCurrentAppInfo(w http.ResponseWriter, r *http.Request) {
if store.GetStore().IsDevLicense() {
isMockEnabled, err := mock.MustGetMock().IsMockEnabled(r.Context())
isMockEnabled, err := mock.MustGetMock().IsMockEnabled(r.Context(), store.GetStore().GetLicense())
if err != nil {
logger.Errorf("failed to check if mock is enabled: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}

if isMockEnabled {
response := GetCurrentAppInfoResponse{
AppSlug: store.GetStore().GetAppSlug(),
AppName: store.GetStore().GetAppName(),
}

mockCurrentRelease, err := mock.MustGetMock().GetCurrentRelease(r.Context())
if err != nil {
logger.Errorf("failed to check if mock is enabled: %v", err)
logger.Errorf("failed to get mock current release: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
if mockCurrentRelease != nil {
response.CurrentRelease = mockReleaseToAppRelease(*mockCurrentRelease)
}

if isMockEnabled {
response := GetCurrentAppInfoResponse{
AppSlug: store.GetStore().GetAppSlug(),
AppName: store.GetStore().GetAppName(),
}

mockCurrentRelease, err := mock.MustGetMock().GetCurrentRelease(r.Context())
if err != nil {
logger.Errorf("failed to get mock current release: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
if mockCurrentRelease != nil {
response.CurrentRelease = mockReleaseToAppRelease(*mockCurrentRelease)
}

mockHelmChartURL, err := mock.MustGetMock().GetHelmChartURL(r.Context())
if err != nil {
logger.Errorf("failed to get mock helm chart url: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
response.HelmChartURL = mockHelmChartURL

JSON(w, http.StatusOK, response)
mockHelmChartURL, err := mock.MustGetMock().GetHelmChartURL(r.Context())
if err != nil {
logger.Errorf("failed to get mock helm chart url: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
response.HelmChartURL = mockHelmChartURL

JSON(w, http.StatusOK, response)
return
}

response := GetCurrentAppInfoResponse{
Expand Down Expand Up @@ -108,34 +106,32 @@ func GetCurrentAppInfo(w http.ResponseWriter, r *http.Request) {
}

func GetAppUpdates(w http.ResponseWriter, r *http.Request) {
if store.GetStore().IsDevLicense() {
isMockEnabled, err := mock.MustGetMock().IsMockEnabled(r.Context())
isMockEnabled, err := mock.MustGetMock().IsMockEnabled(r.Context(), store.GetStore().GetLicense())
if err != nil {
logger.Errorf("failed to check if mock is enabled: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}

if isMockEnabled {
mockAvailableReleases, err := mock.MustGetMock().GetAvailableReleases(r.Context())
if err != nil {
logger.Errorf("failed to check if mock is enabled: %v", err)
logger.Errorf("failed to get available mock releases: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}

if isMockEnabled {
mockAvailableReleases, err := mock.MustGetMock().GetAvailableReleases(r.Context())
if err != nil {
logger.Errorf("failed to get available mock releases: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}

response := []upstreamtypes.ChannelRelease{}
for _, mockRelease := range mockAvailableReleases {
response = append(response, upstreamtypes.ChannelRelease{
VersionLabel: mockRelease.VersionLabel,
CreatedAt: mockRelease.CreatedAt,
ReleaseNotes: mockRelease.ReleaseNotes,
})
}

JSON(w, http.StatusOK, response)
return
response := []upstreamtypes.ChannelRelease{}
for _, mockRelease := range mockAvailableReleases {
response = append(response, upstreamtypes.ChannelRelease{
VersionLabel: mockRelease.VersionLabel,
CreatedAt: mockRelease.CreatedAt,
ReleaseNotes: mockRelease.ReleaseNotes,
})
}

JSON(w, http.StatusOK, response)
return
}

license := store.GetStore().GetLicense()
Expand Down Expand Up @@ -170,33 +166,31 @@ func GetAppUpdates(w http.ResponseWriter, r *http.Request) {
}

func GetAppHistory(w http.ResponseWriter, r *http.Request) {
if store.GetStore().IsDevLicense() {
isMockEnabled, err := mock.MustGetMock().IsMockEnabled(r.Context())
isMockEnabled, err := mock.MustGetMock().IsMockEnabled(r.Context(), store.GetStore().GetLicense())
if err != nil {
logger.Errorf("failed to check if mock is enabled: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}

if isMockEnabled {
mockReleases, err := mock.MustGetMock().GetDeployedReleases(r.Context())
if err != nil {
logger.Errorf("failed to check if mock is enabled: %v", err)
logger.Errorf("failed to get mock releases: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}

if isMockEnabled {
mockReleases, err := mock.MustGetMock().GetDeployedReleases(r.Context())
if err != nil {
logger.Errorf("failed to get mock releases: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}

response := GetAppHistoryResponse{
Releases: []AppRelease{},
}
for _, mockRelease := range mockReleases {
appRelease := mockReleaseToAppRelease(mockRelease)
response.Releases = append(response.Releases, appRelease)
}

JSON(w, http.StatusOK, response)
return
response := GetAppHistoryResponse{
Releases: []AppRelease{},
}
for _, mockRelease := range mockReleases {
appRelease := mockReleaseToAppRelease(mockRelease)
response.Releases = append(response.Releases, appRelease)
}

JSON(w, http.StatusOK, response)
return
}

if !helm.IsHelmManaged() {
Expand Down
13 changes: 9 additions & 4 deletions pkg/mock/mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"sync"

"github.com/pkg/errors"
kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
"gopkg.in/yaml.v2"
corev1 "k8s.io/api/core/v1"
kuberneteserrors "k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -68,7 +69,11 @@ type MockRelease struct {
HelmReleaseNamespace string `json:"helmReleaseNamespace" yaml:"helmReleaseNamespace"`
}

func (m *Mock) IsMockEnabled(ctx context.Context) (bool, error) {
func (m *Mock) IsMockEnabled(ctx context.Context, license *kotsv1beta1.License) (bool, error) {
if license == nil || license.Spec.LicenseType != "dev" {
return false, nil
}

replicatedSecretLock.Lock()
defer replicatedSecretLock.Unlock()

Expand All @@ -80,9 +85,9 @@ func (m *Mock) IsMockEnabled(ctx context.Context) (bool, error) {
return false, errors.Wrap(err, "failed to get replicated secret")
}

v := secret.Data[replicatedMockEnabledKey]
if len(v) == 0 {
return false, nil
v, ok := secret.Data[replicatedMockEnabledKey]
if !ok {
return true, nil
}

enabled, _ := strconv.ParseBool(string(v))
Expand Down
72 changes: 71 additions & 1 deletion pkg/mock/mock_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"testing"

"github.com/pmezard/go-difflib/difflib"
kotsv1beta1 "github.com/replicatedhq/kots/kotskinds/apis/kots/v1beta1"
"github.com/stretchr/testify/require"
"gopkg.in/yaml.v2"
corev1 "k8s.io/api/core/v1"
Expand All @@ -25,9 +26,13 @@ func TestMock_IsMockEnabled(t *testing.T) {
clientset kubernetes.Interface
namespace string
}
type args struct {
license *kotsv1beta1.License
}
tests := []struct {
name string
fields fields
args args
want bool
wantErr bool
}{
Expand Down Expand Up @@ -59,15 +64,80 @@ func TestMock_IsMockEnabled(t *testing.T) {
}),
namespace: "default",
},
args: args{
license: &kotsv1beta1.License{
Spec: kotsv1beta1.LicenseSpec{
LicenseType: "dev",
},
},
},
want: true,
wantErr: false,
},
{
name: "not enabled because not a dev license",
fields: fields{
clientset: fake.NewSimpleClientset(&corev1.SecretList{
TypeMeta: metav1.TypeMeta{},
ListMeta: metav1.ListMeta{},
Items: []corev1.Secret{{
TypeMeta: metav1.TypeMeta{},
ObjectMeta: metav1.ObjectMeta{
Name: replicatedSecretName,
Namespace: "default",
},
Data: map[string][]byte{
replicatedMockEnabledKey: []byte("true"),
},
}},
}),
namespace: "default",
},
args: args{
license: &kotsv1beta1.License{
Spec: kotsv1beta1.LicenseSpec{
LicenseType: "paid",
},
},
},
want: false,
wantErr: false,
},
{
name: "not enabled for a dev license",
fields: fields{
clientset: fake.NewSimpleClientset(&corev1.SecretList{
TypeMeta: metav1.TypeMeta{},
ListMeta: metav1.ListMeta{},
Items: []corev1.Secret{{
TypeMeta: metav1.TypeMeta{},
ObjectMeta: metav1.ObjectMeta{
Name: replicatedSecretName,
Namespace: "default",
},
Data: map[string][]byte{
replicatedMockEnabledKey: []byte("false"),
},
}},
}),
namespace: "default",
},
args: args{
license: &kotsv1beta1.License{
Spec: kotsv1beta1.LicenseSpec{
LicenseType: "dev",
},
},
},
want: false,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
InitMock(tt.fields.clientset, tt.fields.namespace)

got, err := MustGetMock().IsMockEnabled(context.Background())
got, err := MustGetMock().IsMockEnabled(context.Background(), tt.args.license)
if (err != nil) != tt.wantErr {
t.Errorf("Mock.IsMockEnabled() error = %v, wantErr %v", err, tt.wantErr)
return
Expand Down

0 comments on commit 59ee6df

Please sign in to comment.