diff --git a/frontend/packages/dev-console/console-extensions.json b/frontend/packages/dev-console/console-extensions.json index b4c859322cb..858a25ffe61 100644 --- a/frontend/packages/dev-console/console-extensions.json +++ b/frontend/packages/dev-console/console-extensions.json @@ -252,19 +252,40 @@ "properties": { "id": "developer-catalog", "name": "%devconsole~Developer Catalog%", - "insertBefore": "git-repository" + "insertBefore": "serverless-function" }, "flags": { "required": ["DEVELOPER_CATALOG"] } }, + { + "type": "dev-console.add/action-group", + "properties": { + "id": "eventing", + "name": "%devconsole~Eventing%", + "insertAfter": "developer-catalog" + }, + "flags": { + "required": ["KNATIVE_EVENTING", "FLAG_KNATIVE_EVENTING_ENABLED"] + } + }, + { + "type": "dev-console.add/action-group", + "properties": { + "id": "serverless-function", + "name": "%devconsole~Serverless function%", + "insertAfter": "eventing", + "insertBefore": "git-repository", + "icon": { "$codeRef": "icons.serverlessFunctionSVG" } + } + }, { "type": "dev-console.add/action-group", "properties": { "id": "git-repository", "name": "%devconsole~Git Repository%", "insertBefore": "container-images", - "insertAfter": "developer-catalog" + "insertAfter": "serverless-function" } }, { @@ -272,7 +293,6 @@ "properties": { "id": "container-images", "name": "%devconsole~Container images%", - "insertBefore": "eventing", "insertAfter": "git-repository" } }, @@ -281,8 +301,7 @@ "properties": { "id": "local-machine", "name": "%devconsole~From Local Machine%", - "insertBefore": "pipelines", - "insertAfter": "eventing" + "insertBefore": "pipelines" } }, { diff --git a/frontend/packages/dev-console/locales/en/devconsole.json b/frontend/packages/dev-console/locales/en/devconsole.json index 9bbbd39cfb3..0f4bc41c98d 100644 --- a/frontend/packages/dev-console/locales/en/devconsole.json +++ b/frontend/packages/dev-console/locales/en/devconsole.json @@ -9,6 +9,8 @@ "Developer Catalog Types": "Developer Catalog Types", "A list of developer catalog types that are not shown to users.": "A list of developer catalog types that are not shown to users.", "Developer Catalog": "Developer Catalog", + "Eventing": "Eventing", + "Serverless function": "Serverless function", "Git Repository": "Git Repository", "Container images": "Container images", "From Local Machine": "From Local Machine", @@ -74,6 +76,7 @@ "Container Image": "Container Image", "From Catalog": "From Catalog", "Create Serverless function": "Create Serverless function", + "Serverless function using Samples": "Serverless function using Samples", "Delete application": "Delete application", "Delete {{kind}}": "Delete {{kind}}", "Edit {{applicationName}}": "Edit {{applicationName}}", @@ -559,11 +562,6 @@ "Resource type to generate. The default can be set in <2>User Preferences.": "Resource type to generate. The default can be set in <2>User Preferences.", "func.yaml is not present and builder strategy is not s2i": "func.yaml is not present and builder strategy is not s2i", "func.yaml must be present and builder strategy should be s2i to create a Serverless function": "func.yaml must be present and builder strategy should be s2i to create a Serverless function", - "VSCode": "VSCode", - "The OpenShift Serverless Functions support in the VSCode IDE extension enables developers to effortlessly create, build, run, invoke and deploy serverless functions on OpenShift, providing a seamless development experience within the familiar VSCode environment.": "The OpenShift Serverless Functions support in the VSCode IDE extension enables developers to effortlessly create, build, run, invoke and deploy serverless functions on OpenShift, providing a seamless development experience within the familiar VSCode environment.", - "Provided by Red Hat": "Provided by Red Hat", - "IntelliJ": "IntelliJ", - "A plugin for working with Knative on a OpenShift or Kubernetes cluster. This plugin allows developers to view and deploy their applications in a serverless way.": "A plugin for working with Knative on a OpenShift or Kubernetes cluster. This plugin allows developers to view and deploy their applications in a serverless way.", "Support for {{runtime}} is not yet available.": "Support for {{runtime}} is not yet available.", "Unsupported Runtime detected. Please update the Repository URL or change the Build Strategy to continue.": "Unsupported Runtime detected. Please update the Repository URL or change the Build Strategy to continue.", "Builder Image {{image}} is not present.": "Builder Image {{image}} is not present.", diff --git a/frontend/packages/dev-console/src/actions/add-resources.tsx b/frontend/packages/dev-console/src/actions/add-resources.tsx index 64936a9ba9f..373b86d1df8 100644 --- a/frontend/packages/dev-console/src/actions/add-resources.tsx +++ b/frontend/packages/dev-console/src/actions/add-resources.tsx @@ -159,6 +159,7 @@ export const AddActions: { [name: string]: ActionFactory } = { path, disabled: accessReviewDisabled, }), + // Tech debt: ODC-7413: Move Serverless specific actions and providers from devconsole into knative-pluigin CreateServerlessFunction: ( namespace, application, @@ -180,6 +181,27 @@ export const AddActions: { [name: string]: ActionFactory } = { path, disabled: accessReviewDisabled, }), + CreateServerlessFunctionUsingSamples: ( + namespace, + application, + contextSource, + path, + accessReviewDisabled, + ) => ({ + id: 'create-serverless-function-samples', + label: i18next.t('devconsole~Serverless function using Samples'), + icon: , + cta: { + href: resolvedURLWithParams( + '/samples/ns/:namespace?sampleType=Serverless function', + namespace, + application, + contextSource, + ), + }, + path, + disabled: accessReviewDisabled, + }), }; const disabledAddActions = getDisabledAddActions(); diff --git a/frontend/packages/dev-console/src/actions/providers.tsx b/frontend/packages/dev-console/src/actions/providers.tsx index 5ec26ea30d6..1e44b092909 100644 --- a/frontend/packages/dev-console/src/actions/providers.tsx +++ b/frontend/packages/dev-console/src/actions/providers.tsx @@ -177,6 +177,7 @@ export const useTopologyGraphActionProvider: TopologyActionProvider = ({ ), ); } + // Tech debt: ODC-7413: Move Serverless specific actions and providers from devconsole into knative-pluigin if (isServerlessEnabled) { actionsWithSourceRef.push( AddActions.CreateServerlessFunction( @@ -186,6 +187,13 @@ export const useTopologyGraphActionProvider: TopologyActionProvider = ({ '', !isCatalogImageResourceAccess, ), + AddActions.CreateServerlessFunctionUsingSamples( + namespace, + undefined, + sourceReference, + '', + !isCatalogImageResourceAccess, + ), ); } @@ -244,6 +252,7 @@ export const useTopologyGraphActionProvider: TopologyActionProvider = ({ ), ); } + // Tech debt: ODC-7413: Move Serverless specific actions and providers from devconsole into knative-pluigin if (isServerlessEnabled) { actionsWithoutSourceRef.push( AddActions.CreateServerlessFunction( @@ -253,6 +262,13 @@ export const useTopologyGraphActionProvider: TopologyActionProvider = ({ ADD_TO_PROJECT, !isCatalogImageResourceAccess, ), + AddActions.CreateServerlessFunctionUsingSamples( + namespace, + undefined, + undefined, + ADD_TO_PROJECT, + !isCatalogImageResourceAccess, + ), ); } @@ -345,6 +361,7 @@ export const useTopologyApplicationActionProvider: TopologyActionProvider = ({ ), ] : []), + // Tech debt: ODC-7413: Move Serverless specific actions and providers from devconsole into knative-pluigin ...(isServerlessEnabled ? [ AddActions.CreateServerlessFunction( @@ -354,6 +371,13 @@ export const useTopologyApplicationActionProvider: TopologyActionProvider = ({ path, !isCatalogImageResourceAccess, ), + AddActions.CreateServerlessFunctionUsingSamples( + namespace, + application, + sourceReference, + path, + !isCatalogImageResourceAccess, + ), ] : []), ].filter(disabledActionsFilter); diff --git a/frontend/packages/dev-console/src/components/import/GitImportForm.tsx b/frontend/packages/dev-console/src/components/import/GitImportForm.tsx index 1311ac2052c..d627f96b6bc 100644 --- a/frontend/packages/dev-console/src/components/import/GitImportForm.tsx +++ b/frontend/packages/dev-console/src/components/import/GitImportForm.tsx @@ -15,8 +15,6 @@ import GitSection from './git/GitSection'; import { BuildOptions, GitImportFormProps, ImportTypes } from './import-types'; import ImportStrategySection from './ImportStrategySection'; import { BuildSection } from './section/BuildSection'; -import ExtensionCards from './serverless-function/ExtensionCards'; -import './serverless-function/AddServerlessFunctionForm.scss'; const GitImportForm: React.FC & GitImportFormProps> = ({ values, @@ -50,8 +48,6 @@ const GitImportForm: React.FC & GitImportFormProps> = importType !== ImportTypes.devfile && values.import.selectedStrategy.type !== ImportStrategy.DEVFILE && !isSample; - const showExtensionCards = - values.import.selectedStrategy.type === ImportStrategy.SERVERLESS_FUNCTION && isSample; return (
@@ -98,12 +94,6 @@ const GitImportForm: React.FC & GitImportFormProps> = )} - - {showExtensionCards && } - ; const SampleCatalog: React.FC = ({ match }) => { const { t } = useTranslation(); const namespace = match.params.ns; + const params = new URLSearchParams(window.location.search); + const sampleType = params.get('sampleType'); + const labelFilter: Record = { + label: 'sample-type', + value: sampleType, + }; return ( <> @@ -19,16 +26,31 @@ const SampleCatalog: React.FC = ({ match }) => { {namespace ? ( - {(service) => ( - - )} + {(service) => { + let filteredLists: CatalogItem[]; + if (sampleType) { + filteredLists = service.items.filter((item) => { + return ( + item?.typeLabel === labelFilter?.value || + item?.data?.metadata?.labels[labelFilter?.label] === labelFilter?.value + ); + }); + } else { + filteredLists = service.items; + } + const catalogItems = { ...service, items: filteredLists }; + + return ( + + ); + }} ) : ( diff --git a/frontend/packages/dev-console/src/components/import/serverless-function/AddServerlessFunctionForm.scss b/frontend/packages/dev-console/src/components/import/serverless-function/AddServerlessFunctionForm.scss deleted file mode 100644 index 560c502b083..00000000000 --- a/frontend/packages/dev-console/src/components/import/serverless-function/AddServerlessFunctionForm.scss +++ /dev/null @@ -1,54 +0,0 @@ -@import '../../../../../../public/style/mixin/catalog-logo-background'; - -$serverless-extension-item-icon-size: 40px; - -.odc-serverless-extensions-card { - margin-top: var(--pf-global--spacer--lg); - padding: 0 var(--pf-global--spacer--md) var(--pf-global--spacer--md) 0; -} - -.odc-serverless-extension-provider { - font-weight: var(--pf-global--FontWeight--normal); - font-family: var(--pf-global--FontFamily--sans-serif); -} - -.odc-serverless-extensions-card-title { - align-items: flex-start; - display: flex; - &__icon { - @include catalog-logo-background(); - align-items: center; - display: flex; - flex: 0 0 auto; - justify-content: center; - margin: 0 var(--pf-global--spacer--md) var(--pf-global--spacer--form-element) 0; - } - &__name { - display: flex; - flex-direction: column; - justify-content: center; - &__link { - font-size: var(--pf-global--FontSize--md); - margin-bottom: var(--pf-global--spacer--sm); - } - } -} - -.odc-serverless-extensions-logo { - @include catalog-logo-background(); - margin-right: var(--pf-global--spacer--md); - &__bg { - align-items: center; - display: flex; - min-height: 40px; - min-width: 40px; // prevent Firefox from collapsing the img since it assigns base64 encoded svg without height and width values to 0 https://bugzilla.mozilla.org/show_bug.cgi?id=1328124 and https://jsbin.com/kuzovihumo/edit?js,console - } - &__img { - max-height: $serverless-extension-item-icon-size; - max-width: $serverless-extension-item-icon-size; - &[src$='.svg'] { - width: $serverless-extension-item-icon-size; - } - width: 100%; // prevent image size collapse to 0 - } -} \ No newline at end of file diff --git a/frontend/packages/dev-console/src/components/import/serverless-function/AddServerlessFunctionForm.tsx b/frontend/packages/dev-console/src/components/import/serverless-function/AddServerlessFunctionForm.tsx index 611771fa0ee..fa80f1eb5c4 100644 --- a/frontend/packages/dev-console/src/components/import/serverless-function/AddServerlessFunctionForm.tsx +++ b/frontend/packages/dev-console/src/components/import/serverless-function/AddServerlessFunctionForm.tsx @@ -24,9 +24,7 @@ import { notSupportedRuntime } from '../../../utils/serverless-functions'; import AdvancedSection from '../advanced/AdvancedSection'; import AppSection from '../app/AppSection'; import GitSection from '../git/GitSection'; -import ExtensionCards from './ExtensionCards'; import ServerlessFunctionStrategySection from './ServerlessFunctionStrategySection'; -import './AddServerlessFunctionForm.scss'; type AddServerlessFunctionFormProps = { builderImages?: NormalizedBuilderImages; @@ -157,12 +155,6 @@ const AddServerlessFunctionForm: React.FC< )} - - - = ({ - icon, - link, - title, - description, - provider, -}) => { - return ( - - -
-
- - - -
-
-

- -

- {provider} -
-
-
- -

{description}

-
-
- ); -}; - -export default ExtensionCard; diff --git a/frontend/packages/dev-console/src/components/import/serverless-function/ExtensionCards.tsx b/frontend/packages/dev-console/src/components/import/serverless-function/ExtensionCards.tsx deleted file mode 100644 index cdb0bb3d358..00000000000 --- a/frontend/packages/dev-console/src/components/import/serverless-function/ExtensionCards.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import * as React from 'react'; -import { Flex, FlexItem } from '@patternfly/react-core'; -import { useTranslation } from 'react-i18next'; -import * as intellijImg from '@console/internal/imgs/logos/intellij.png'; -import * as vscodeImg from '@console/internal/imgs/logos/vscode.png'; -import ExtensionCard from './ExtensionCard'; - -const ExtensionCards: React.FC<{}> = () => { - const { t } = useTranslation(); - - return ( - - - - - - - - - ); -}; - -export default ExtensionCards; diff --git a/frontend/packages/knative-plugin/console-extensions.json b/frontend/packages/knative-plugin/console-extensions.json index 81ff54c5cc6..f306d1d605a 100644 --- a/frontend/packages/knative-plugin/console-extensions.json +++ b/frontend/packages/knative-plugin/console-extensions.json @@ -528,18 +528,6 @@ "handler": { "$codeRef": "catalog.useKnativeEventingProvider" } } }, - { - "type": "dev-console.add/action-group", - "properties": { - "id": "eventing", - "name": "%knative-plugin~Eventing%", - "insertBefore": "local-machine", - "insertAfter": "container-images" - }, - "flags": { - "required": ["KNATIVE_EVENTING", "FLAG_KNATIVE_EVENTING_ENABLED"] - } - }, { "type": "console.flag/hookProvider", "properties": { @@ -565,14 +553,6 @@ "icon": { "$codeRef": "icons.eventSourceIconSVG" } } }, - { - "type": "dev-console.add/action-group", - "properties": { - "id": "serverless-function", - "name": "%knative-plugin~Create Serverless function%", - "insertBefore": "eventing" - } - }, { "type": "dev-console.add/action", "flags": { @@ -582,9 +562,9 @@ "id": "create-serverless-function", "groupId": "serverless-function", "href": "/serverless-function/ns/:namespace", - "label": "%knative-plugin~Create Serverless function%", + "label": "%knative-plugin~Import from git%", "description": "%knative-plugin~Create and deploy stateless, Serverless functions%", - "icon": { "$codeRef": "icons.serverlessFunctionSVG" }, + "icon": { "$codeRef": "icons.gitIconElement" }, "accessReview": [ { "group": "serving.knative.dev", @@ -594,6 +574,38 @@ ] } }, + { + "type": "dev-console.add/action", + "properties": { + "id": "create-serverless-function-samples", + "groupId": "serverless-function", + "href": "/samples/ns/:namespace?sampleType=Serverless function", + "label": "%knative-plugin~Samples%", + "description": "%knative-plugin~Build from pre-built function sample code%", + "icon": { "$codeRef": "icons.samplesIconElement" }, + "accessReview": [ + { "group": "build.openshift.io", "resource": "buildconfigs", "verb": "create" }, + { "group": "image.openshift.io", "resource": "imagestreams", "verb": "create" }, + { "group": "apps.openshift.io", "resource": "deploymentconfigs", "verb": "create" }, + { "group": "", "resource": "secrets", "verb": "create" }, + { "group": "route.openshift.io", "resource": "routes", "verb": "create" }, + { "group": "", "resource": "services", "verb": "create" }, + { + "group": "serving.knative.dev", + "resource": "services", + "verb": "create" + } + ] + }, + "flags": { + "required": [ + "DEVELOPER_CATALOG", + "SAMPLE_CATALOG_TYPE", + "KNATIVE_SERVING", + "KNATIVE_SERVING_SERVICE" + ] + } + }, { "type": "dev-console.add/action", "flags": { diff --git a/frontend/packages/knative-plugin/integration-tests/features/functions/functions-navigation.feature b/frontend/packages/knative-plugin/integration-tests/features/functions/functions-navigation.feature index 06bf7ad1eb9..bbf9f75da19 100644 --- a/frontend/packages/knative-plugin/integration-tests/features/functions/functions-navigation.feature +++ b/frontend/packages/knative-plugin/integration-tests/features/functions/functions-navigation.feature @@ -11,7 +11,13 @@ Feature: Navigations to Serverless Functions page Scenario: User navigates to Functions page when no Function is created: KN-08-TC01 When user clicks on the Functions tab Then user redirected to Functions page - And user is able to see the message "No Functions found" + And user is able to see the message "No functions found" + And user will see Getting started resources + And user will see Create functions using Samples + And user will see create with guided documentation + And user will see Explore serverless functions + And user is able to see the Create function drop down menu with Import from Git and Samples options + @smoke Scenario: User navigates to Functions page when Function is created: KN-08-TC02 diff --git a/frontend/packages/knative-plugin/integration-tests/features/serverless/serverless-function.feature b/frontend/packages/knative-plugin/integration-tests/features/serverless/serverless-function.feature index d9f52a61032..65eebd22c1e 100644 --- a/frontend/packages/knative-plugin/integration-tests/features/serverless/serverless-function.feature +++ b/frontend/packages/knative-plugin/integration-tests/features/serverless/serverless-function.feature @@ -158,10 +158,3 @@ Feature: Creation and Visualisation of serverless fuctions | https://github.com/openshift-dev-console/kn-func-typescript-http | kn-func-typescript-http | HTTP | | https://github.com/openshift-dev-console/kn-func-typescript-cloudevents | kn-func-typescript-cloudevents | CloudEvent | - - @regression @odc-7316 - Scenario: Create serverless form extensions cards: SF-01-TC11 - Given user is at Add page - When user clicks on Create Serverless function card - Then user will be able to see VSCode extension card - And user will be able to see IntelliJ extension card diff --git a/frontend/packages/knative-plugin/integration-tests/support/pageObjects/functions-po.ts b/frontend/packages/knative-plugin/integration-tests/support/pageObjects/functions-po.ts index 47fb8ab47bf..1f581ca0eb5 100644 --- a/frontend/packages/knative-plugin/integration-tests/support/pageObjects/functions-po.ts +++ b/frontend/packages/knative-plugin/integration-tests/support/pageObjects/functions-po.ts @@ -1,8 +1,9 @@ export const functionsPO = { - emptyState: 'div.pf-c-empty-state__content', + emptyState: '[data-test="empty-state-title"]', table: '[role="grid"]', search: '[data-test-id="item-filter"]', revisionsTab: '[data-test-id="horizontal-link-Revisions"]', routesTab: '[data-test-id="horizontal-link-Routes"]', podsTab: '[data-test-id="horizontal-link-Pods"]', + gettingStarted: '[data-test="getting-started"]', }; diff --git a/frontend/packages/knative-plugin/integration-tests/support/pages/functions/functions-page.ts b/frontend/packages/knative-plugin/integration-tests/support/pages/functions/functions-page.ts index df656db55c1..274a133d451 100644 --- a/frontend/packages/knative-plugin/integration-tests/support/pages/functions/functions-page.ts +++ b/frontend/packages/knative-plugin/integration-tests/support/pages/functions/functions-page.ts @@ -1,7 +1,7 @@ import { functionsPO } from '../../pageObjects/functions-po'; export const functionsPage = { - verifyTitle: () => cy.byTestSectionHeading('Service details').should('be.visible'), + verifyTitle: () => cy.byTestSectionHeading('Details').should('be.visible'), verifyMessage: (noFunctionsFound: string) => cy.get(functionsPO.emptyState).contains(noFunctionsFound), verifyFunctionsListed: () => { @@ -18,4 +18,12 @@ export const functionsPage = { verifyRevisionsTab: () => cy.get(functionsPO.revisionsTab).should('be.visible'), verifyRoutesTab: () => cy.get(functionsPO.routesTab).should('be.visible'), verifyPodsTab: () => cy.get(functionsPO.podsTab).should('be.visible'), + verifyGettingStarted: () => cy.get(functionsPO.gettingStarted).should('be.visible'), + verifyFunctionsActionsDropdown: () => + cy.byLegacyTestID('dropdown-button').eq(0).should('be.visible'), + clickFunctionsActionButton: () => cy.byLegacyTestID('dropdown-button').eq(0).click(), + verifyActionsInCreateMenu: () => { + cy.byLegacyTestID('dropdown-menu').contains('Import from Git').should('exist'); + cy.byLegacyTestID('dropdown-menu').contains('Samples').should('exist'); + }, }; diff --git a/frontend/packages/knative-plugin/integration-tests/support/step-definitions/functions/functions-navigation.ts b/frontend/packages/knative-plugin/integration-tests/support/step-definitions/functions/functions-navigation.ts index c005d7fac37..22e4b5bb920 100644 --- a/frontend/packages/knative-plugin/integration-tests/support/step-definitions/functions/functions-navigation.ts +++ b/frontend/packages/knative-plugin/integration-tests/support/step-definitions/functions/functions-navigation.ts @@ -68,3 +68,29 @@ Then('user is able to see Revisions, Routes and Pods tabs', () => { functionsPage.verifyRoutesTab(); functionsPage.verifyPodsTab(); }); + +Then('user will see Getting started resources', () => { + functionsPage.verifyGettingStarted(); +}); + +Then('user will see Create functions using Samples', () => { + cy.exec(`oc apply -f support/testData/serverless-functions-samples.yaml`); + cy.byTestID('card samples').should('be.visible'); +}); + +Then('user will see create with guided documentation', () => { + cy.byTestID('card quick-start').should('be.visible'); +}); + +Then('user will see Explore serverless functions', () => { + cy.byTestID('card serverless-features').should('be.visible'); +}); + +Then( + 'user is able to see the Create function drop down menu with Import from Git and Samples options', + () => { + functionsPage.verifyFunctionsActionsDropdown(); + functionsPage.clickFunctionsActionButton(); + functionsPage.verifyActionsInCreateMenu(); + }, +); diff --git a/frontend/packages/knative-plugin/integration-tests/support/testData/serverless-functions-samples.yaml b/frontend/packages/knative-plugin/integration-tests/support/testData/serverless-functions-samples.yaml new file mode 100644 index 00000000000..f4768666685 --- /dev/null +++ b/frontend/packages/knative-plugin/integration-tests/support/testData/serverless-functions-samples.yaml @@ -0,0 +1,325 @@ +apiVersion: console.openshift.io/v1 +kind: ConsoleSample +metadata: + name: kn-func-typescript-http +spec: + title: Knative TypeScript HTTP Function + abstract: Import a Knative function from a sample Git repository. + description: | + A Knative func example created with + + ``` + [kn] func create -l typescript -t http + ``` + # Node.js svg icon as base64 + icon: | + data:image;base64, + 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 + provider: Red Hat + type: Serverless function + tags: + - knative + - typescript + - http + source: + type: GitImport + gitImport: + repository: + url: https://github.com/openshift-dev-console/kn-func-typescript-http +--- +apiVersion: console.openshift.io/v1 +kind: ConsoleSample +metadata: + name: kn-func-typescript-cloudevents +spec: + title: Knative TypeScript CloudEvent Function + abstract: Import a Knative function from a sample Git repository. + description: | + A Knative func example created with + + ``` + [kn] func create -l typescript -t cloudevents + ``` + # Node.js svg icon as base64 + icon: | + data:image;base64, + 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 + provider: Red Hat + type: Serverless function + tags: + - knative + - typescript + - http + source: + type: GitImport + gitImport: + repository: + url: https://github.com/openshift-dev-console/kn-func-typescript-cloudevents \ No newline at end of file diff --git a/frontend/packages/knative-plugin/locales/en/knative-plugin.json b/frontend/packages/knative-plugin/locales/en/knative-plugin.json index b3fbd4d12f9..b653fdd75b9 100644 --- a/frontend/packages/knative-plugin/locales/en/knative-plugin.json +++ b/frontend/packages/knative-plugin/locales/en/knative-plugin.json @@ -1,10 +1,11 @@ { "Functions": "Functions", - "Eventing": "Eventing", "Event Source": "Event Source", "Create an Event source to register interest in a class of events from a particular system": "Create an Event source to register interest in a class of events from a particular system", - "Create Serverless function": "Create Serverless function", + "Import from git": "Import from git", "Create and deploy stateless, Serverless functions": "Create and deploy stateless, Serverless functions", + "Samples": "Samples", + "Build from pre-built function sample code": "Build from pre-built function sample code", "Broker": "Broker", "Create a Broker to define an event mesh for collecting a pool of events and route those events based on attributes, through triggers": "Create a Broker to define an event mesh for collecting a pool of events and route those events based on attributes, through triggers", "Channel": "Channel", @@ -19,6 +20,7 @@ "​​Event sinks are resources that can receive incoming events from other resources. Cluster administrators can customize the content made available in the catalog.": "​​Event sinks are resources that can receive incoming events from other resources. Cluster administrators can customize the content made available in the catalog.", "​​**Event sinks** are resources that can receive incoming events from other resources.": "​​**Event sinks** are resources that can receive incoming events from other resources.", "Serving": "Serving", + "Eventing": "Eventing", "Create Service Binding": "Create Service Binding", "Subscriptions": "Subscriptions", "Triggers": "Triggers", @@ -202,8 +204,24 @@ "{{OKcount}} OK / {{conditionsSize}}": "{{OKcount}} OK / {{conditionsSize}}", "Subscriber": "Subscriber", "Filters": "Filters", - "No Functions found": "No Functions found", + "Import from Git": "Import from Git", + "Create function": "Create function", + "Building Functions on Cluster with Tekton Pipelines": "Building Functions on Cluster with Tekton Pipelines", + "Explore serverless functions": "Explore serverless functions", + "Explore new features and resources within the serverless functions.": "Explore new features and resources within the serverless functions.", + "No functions found": "No functions found", + "Serverless functions are single-purpose, programmatic functions that are hosted on managed infrastructure.": "Serverless functions are single-purpose, programmatic functions that are hosted on managed infrastructure.", "Select a Project to view its details<1>.": "Select a Project to view its details<1>.", + "Get started with functions": "Get started with functions", + "Choose how to create a function from 3 methods": "Choose how to create a function from 3 methods", + "Create function with guided documentation": "Create function with guided documentation", + "Follow guided documentation to create serverless functions.": "Follow guided documentation to create serverless functions.", + "Create using IDE extension": "Create using IDE extension", + "Build with guided documentation": "Build with guided documentation", + "Follow guided documentation to build applications and familiarize yourself with key features.": "Follow guided documentation to build applications and familiarize yourself with key features.", + "View all samples": "View all samples", + "Create functions using samples": "Create functions using samples", + "Choose a code sample to create a function.": "Choose a code sample to create a function.", "There is an existing placeholder Service with name {{name}} in namespace {{namespace}}. Please provide another name": "There is an existing placeholder Service with name {{name}} in namespace {{namespace}}. Please provide another name", "This feature will create a new serverless deployment next to your existing deployment. Other configurations, including the traffic pattern, can be modified in the form.": "This feature will create a new serverless deployment next to your existing deployment. Other configurations, including the traffic pattern, can be modified in the form.", "No configurations found for this resource.": "No configurations found for this resource.", @@ -249,9 +267,8 @@ "Route details": "Route details", "URL": "URL", "Traffic": "Traffic", - "Service details": "Service details", + "Details": "Details", "Containers": "Containers", - "Generation": "Generation", "Non-functions": "Non-functions", "Connects {{resourceName}} to": "Connects <1>{{resourceName}} to", "Select a sink": "Select a sink", diff --git a/frontend/packages/knative-plugin/package.json b/frontend/packages/knative-plugin/package.json index 1c76d44b159..13edb671e65 100644 --- a/frontend/packages/knative-plugin/package.json +++ b/frontend/packages/knative-plugin/package.json @@ -31,7 +31,8 @@ "knatifyComponent": "src/components/knatify", "knativeTopologySidebar": "src/topology/sidebar", "topology": "src/topology", - "eventingContext": "src/topology/eventing-context.ts" + "eventingContext": "src/topology/eventing-context.ts", + "functionsComponent": "src/components/functions" } } } diff --git a/frontend/packages/knative-plugin/src/components/functions/CreateActionDropdown.tsx b/frontend/packages/knative-plugin/src/components/functions/CreateActionDropdown.tsx new file mode 100644 index 00000000000..8e9152f4c57 --- /dev/null +++ b/frontend/packages/knative-plugin/src/components/functions/CreateActionDropdown.tsx @@ -0,0 +1,56 @@ +import * as React from 'react'; +import { useTranslation } from 'react-i18next'; +import { history, Dropdown } from '@console/internal/components/utils'; +import { MenuAction, MenuActions, useActiveNamespace } from '@console/shared/src'; + +export const CreateActionDropdown: React.FC = () => { + const { t } = useTranslation(); + const [activeNamespace] = useActiveNamespace(); + + const menuActions: MenuActions = { + importfromGit: { + label: t('knative-plugin~Import from Git'), + onSelection: () => `/serverless-function/ns/${activeNamespace}`, + }, + functionsUsingSamples: { + label: t('knative-plugin~Samples'), + onSelection: () => `/samples/ns/${activeNamespace}?sampleType=Serverless function`, + }, + }; + + const items = menuActions + ? Object.keys(menuActions).reduce>((acc, key) => { + const menuAction: MenuAction = menuActions[key]; + const { label } = menuAction; + if (!label) return acc; + + return { + ...acc, + [key]: label, + }; + }, {}) + : undefined; + + const onSelectCreateAction = (actionName: string): void => { + const selectedMenuItem: MenuAction = menuActions[actionName]; + let url: string; + if (selectedMenuItem.onSelection) { + url = selectedMenuItem.onSelection(actionName, selectedMenuItem, url); + } + if (url) { + history.push(url); + } + }; + + return ( + + ); +}; diff --git a/frontend/packages/knative-plugin/src/components/functions/FunctionRow.tsx b/frontend/packages/knative-plugin/src/components/functions/FunctionRow.tsx index 94839aec521..5958e45a0b3 100644 --- a/frontend/packages/knative-plugin/src/components/functions/FunctionRow.tsx +++ b/frontend/packages/knative-plugin/src/components/functions/FunctionRow.tsx @@ -12,8 +12,9 @@ import { referenceFor, referenceForModel } from '@console/internal/module/k8s'; import { LazyActionMenu, ClampedText } from '@console/shared'; import { ServiceModel } from '../../models'; import { ServiceKind, ConditionTypes } from '../../types'; -import { getConditionString, getCondition } from '../../utils/condition-utils'; +import { getCondition } from '../../utils/condition-utils'; import { tableColumnClasses } from '../services/service-table'; +import GetConditionsForStatus from './GetConditionsForStatus'; const serviceReference = referenceForModel(ServiceModel); @@ -48,22 +49,22 @@ const FunctionRow: React.FC> = ({ obj }) => { )) || '-'} - {obj.metadata.generation || '-'} - - + + {obj.status ? : '-'} - - {obj.status ? getConditionString(obj.status.conditions) : '-'} - - + {(readyCondition && readyCondition.status) || '-'} - + {(readyCondition?.message && ( {readyCondition?.message} )) || '-'} + {obj.metadata.generation || '-'} + + + diff --git a/frontend/packages/knative-plugin/src/components/functions/FunctionsDocsGettingStartedCard.tsx b/frontend/packages/knative-plugin/src/components/functions/FunctionsDocsGettingStartedCard.tsx new file mode 100644 index 00000000000..1d7a63f4021 --- /dev/null +++ b/frontend/packages/knative-plugin/src/components/functions/FunctionsDocsGettingStartedCard.tsx @@ -0,0 +1,32 @@ +import * as React from 'react'; +import { FlagIcon } from '@patternfly/react-icons'; +import { useTranslation } from 'react-i18next'; +import { + GettingStartedLink, + GettingStartedCard, +} from '@console/shared/src/components/getting-started'; + +export const FunctionsDocsGettingStartedCard: React.FC = () => { + const { t } = useTranslation(); + const links: GettingStartedLink[] = []; + + links.push({ + id: 'functions-tekton-pipelines', + title: t('knative-plugin~Building Functions on Cluster with Tekton Pipelines'), + href: 'https://github.com/knative/func/blob/main/docs/building-functions/on_cluster_build.md', + external: true, + }); + + return ( +