Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: create helper functions for pepr #688

Merged
merged 29 commits into from
Apr 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
26f429f
initial sdk setup
schaeferka Mar 21, 2024
84f564b
initial sdk setup
schaeferka Mar 21, 2024
a80f0fe
updated sanitizeResourceName
schaeferka Mar 21, 2024
83e3f40
updated getOwnerRef
schaeferka Mar 21, 2024
56b17a4
updated containers description
schaeferka Mar 21, 2024
ca2bda7
added initial code for writeEvent
schaeferka Mar 21, 2024
c88a548
updates to test
schaeferka Mar 21, 2024
227d9da
Merge branch 'main' into 672-create-helper-functions-to-bring-into-pepr
schaeferka Mar 25, 2024
a9ba915
removed writeEvent test
schaeferka Mar 25, 2024
4201284
added tests for sanitizeResourceName
schaeferka Mar 25, 2024
e9dfe71
added test for writeEvent
schaeferka Mar 25, 2024
aba71af
format fix
schaeferka Mar 25, 2024
24cf24f
removed helpers from lib.ts
schaeferka Apr 1, 2024
ab3f5f7
moved sdk files to sdk folder
schaeferka Apr 1, 2024
51c1169
moved sdk files to sdk folder
schaeferka Apr 1, 2024
adfd7bc
Merge branch 'main' into 672-create-helper-functions-to-bring-into-pepr
schaeferka Apr 1, 2024
1458720
moved sdk folder
schaeferka Apr 1, 2024
42fa738
updated sdk imports
schaeferka Apr 3, 2024
8648a33
Merge branch 'main' into 672-create-helper-functions-to-bring-into-pepr
schaeferka Apr 3, 2024
dc91d41
format fix
schaeferka Apr 3, 2024
fe94f47
Merge branch '672-create-helper-functions-to-bring-into-pepr' of gith…
schaeferka Apr 3, 2024
d1513af
changed name of function to ownerRefFor
schaeferka Apr 4, 2024
b3d272a
Merge branch 'main' into 672-create-helper-functions-to-bring-into-pepr
schaeferka Apr 4, 2024
226f25b
Merge branch 'main' into 672-create-helper-functions-to-bring-into-pepr
schaeferka Apr 4, 2024
c022a0c
Merge branch 'main' into 672-create-helper-functions-to-bring-into-pepr
schaeferka Apr 4, 2024
309b473
Merge branch 'main' into 672-create-helper-functions-to-bring-into-pepr
schaeferka Apr 4, 2024
45ff3c3
changed ownerRefFrom to getOwnerRefFrom
schaeferka Apr 5, 2024
e6c7d72
Merge branch 'main' into 672-create-helper-functions-to-bring-into-pepr
schaeferka Apr 5, 2024
8173fef
Merge branch 'main' into 672-create-helper-functions-to-bring-into-pepr
cmwylie19 Apr 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/lib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { PeprModule } from "./lib/module";
import { PeprMutateRequest } from "./lib/mutate-request";
import * as PeprUtils from "./lib/utils";
import { PeprValidateRequest } from "./lib/validate-request";
import { containers } from "./lib/module-helpers";
import * as sdk from "./sdk/sdk";

export {
Capability,
Expand All @@ -23,5 +23,5 @@ export {
fetch,
fetchStatus,
kind,
containers,
sdk,
};
96 changes: 0 additions & 96 deletions src/lib/module-helpers.test.ts

This file was deleted.

27 changes: 0 additions & 27 deletions src/lib/module-helpers.ts

This file was deleted.

217 changes: 217 additions & 0 deletions src/sdk/sdk.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2023-Present The Pepr Authors

import { expect, test } from "@jest/globals";
import { PeprValidateRequest } from "../lib/validate-request";
import { PeprMutateRequest } from "../lib/mutate-request";
import { a } from "../lib";
import { containers, writeEvent, getOwnerRefFrom, sanitizeResourceName } from "./sdk";

import { beforeEach, describe, it, jest } from "@jest/globals";
import { GenericKind } from "kubernetes-fluent-client";
import { K8s, kind } from "kubernetes-fluent-client";
import { Mock } from "jest-mock";

jest.mock("kubernetes-fluent-client", () => ({
K8s: jest.fn(),
Log: {
debug: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
},
kind: {
CoreEvent: "CoreEvent",
},
}));

describe("containers", () => {
test("should return a list of containers in the pod when in a validate block", async () => {
const standardContainers = [
{
name: "container-1",
},
];
const initContainers = [
{
name: "init-container-1",
},
];
const ephemeralContainers = [
{
name: "ephemeral-container-1",
},
];
const allContainers = [...standardContainers, ...initContainers, ...ephemeralContainers];
const peprValidationRequest = {
Raw: {
spec: {
containers: standardContainers,
initContainers,
ephemeralContainers,
},
},
} as PeprValidateRequest<a.Pod>;

let result = containers(peprValidationRequest);
expect(result).toEqual(expect.arrayContaining(allContainers));
expect(result).toHaveLength(allContainers.length);

result = containers(peprValidationRequest, "containers");
expect(result).toEqual(expect.arrayContaining(standardContainers));
expect(result).toHaveLength(standardContainers.length);

result = containers(peprValidationRequest, "initContainers");
expect(result).toEqual(expect.arrayContaining(initContainers));
expect(result).toHaveLength(initContainers.length);

result = containers(peprValidationRequest, "ephemeralContainers");
expect(result).toEqual(expect.arrayContaining(ephemeralContainers));
expect(result).toHaveLength(ephemeralContainers.length);
});

test("should return a list of containers in the pod when in a mutate block", async () => {
const standardContainers = [
{
name: "container-1",
},
];
const initContainers = [
{
name: "init-container-1",
},
];
const ephemeralContainers = [
{
name: "ephemeral-container-1",
},
];
const allContainers = [...standardContainers, ...initContainers, ...ephemeralContainers];
const peprMutateRequest = {
Raw: {
spec: {
containers: standardContainers,
initContainers,
ephemeralContainers,
},
},
} as PeprMutateRequest<a.Pod>;

let result = containers(peprMutateRequest);
expect(result).toEqual(expect.arrayContaining(allContainers));
expect(result).toHaveLength(allContainers.length);

result = containers(peprMutateRequest, "containers");
expect(result).toEqual(expect.arrayContaining(standardContainers));
expect(result).toHaveLength(standardContainers.length);

result = containers(peprMutateRequest, "initContainers");
expect(result).toEqual(expect.arrayContaining(initContainers));
expect(result).toHaveLength(initContainers.length);

result = containers(peprMutateRequest, "ephemeralContainers");
expect(result).toEqual(expect.arrayContaining(ephemeralContainers));
expect(result).toHaveLength(ephemeralContainers.length);
});
});

describe("writeEvent", () => {
let Create: Mock;
beforeEach(() => {
jest.clearAllMocks();

Create = jest.fn();

(K8s as jest.Mock).mockImplementation(() => ({
Create,
PatchStatus: jest.fn(),
}));
});

it("should write a K8s event for the CRD", async () => {
const cr = {
apiVersion: "v1",
kind: "Package",
metadata: { name: "test", namespace: "default", uid: "1" },
};
const event = { message: "Test event" };
await writeEvent(
cr as GenericKind,
event,
"Warning",
"ReconciliationFailed",
"uds.dev/operator",
process.env.HOSTNAME as string,
);
expect(K8s).toHaveBeenCalledWith(kind.CoreEvent);
expect(Create).toHaveBeenCalledWith({
...event,
type: "Warning",
reason: "ReconciliationFailed",
metadata: { namespace: "default", generateName: "test" },
involvedObject: {
apiVersion: "v1",
kind: "Package",
name: "test",
namespace: "default",
uid: "1",
},
firstTimestamp: expect.any(Date),
reportingComponent: "uds.dev/operator",
reportingInstance: process.env.HOSTNAME,
});
});
});

describe("getOwnerRefFrom", () => {
it("should return the owner reference for the CRD", () => {
const cr = {
apiVersion: "v1",
kind: "Package",
metadata: { name: "test", namespace: "default", uid: "1" },
};
const ownerRef = getOwnerRefFrom(cr as GenericKind);
expect(ownerRef).toEqual([
{
apiVersion: "v1",
kind: "Package",
name: "test",
uid: "1",
},
]);
});
});

describe("sanitizeResourceName", () => {
it("should return same resource name if no sanitization needed", () => {
const resourceName = "test-resource";
const sanitizedResourceName = sanitizeResourceName(resourceName);
expect(sanitizedResourceName).toEqual("test-resource");
});

it("should replace capital letters with lowercase letters", () => {
const resourceName = "Test-ResourCe";
const sanitizedResourceName = sanitizeResourceName(resourceName);
expect(sanitizedResourceName).toEqual("test-resource");
});

it("should replace sequences of non-alphanumeric characters with a single -", () => {
const resourceName = "test-*^%- -!=!resource";
const sanitizedResourceName = sanitizeResourceName(resourceName);
expect(sanitizedResourceName).toEqual("test-resource");
});

it("should truncate name to 250 characters", () => {
const resourceName =
"test-resourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresource";
const sanitizedResourceName = sanitizeResourceName(resourceName);
expect(sanitizedResourceName).toEqual(
"test-resourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresourceresou",
);
});

it("should remove leading and trailing non-letter characters", () => {
const resourceName = " 1=-test-resource *2 ";
const sanitizedResourceName = sanitizeResourceName(resourceName);
expect(sanitizedResourceName).toEqual("test-resource");
});
});
Loading
Loading