Repository: openshift/odo
Pull request #3917 (2020-09-09 10:27:29)

add test for odo url create --context flag
**What type of PR is this?**
> Uncomment only one ` /kind` line, and delete the rest.
> For example, `> /kind bug` would simply become: `/kind bug`

/kind bug

**What does does this PR do / why we need it**:
See $SUBJECT

**Which issue(s) this PR fixes**:

No issue

**PR acceptance criteria**:

- [ ] Unit test 

- [X] Integration test 

- [ ] Documentation 

- [X] I have read the [test guidelines](https://github.com/openshift/odo/blob/master/docs/dev/test-architecture.adoc)

**How to test changes / Special notes to the reviewer**:
test should pass

openshift-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **girishramnani**
You can assign the PR to them by writing `/assign @girishramnani` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=openshift%2Fodo).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/openshift/odo/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["girishramnani"]} -->
dharmit: Works for me.

/approve
openshift-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/openshift/odo/pull/3917#issuecomment-689493054" title="Approved">dharmit</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=openshift%2Fodo).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/openshift/odo/blob/master/OWNERS)~~ [dharmit]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
kadel: /lgtm
openshift-bot: /retest

Please review the [full test history](https://prow.ci.openshift.org/pr-history/?org=openshift&repo=odo&pr=3917) for this PR and help us cut down flakes.
mik-dass: PR needs rebase
/hold
openshift-ci-robot: New changes are detected. LGTM label has been removed.
openshift-ci-robot: @girishramnani: PR needs rebase.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>
openshift-ci-robot: @girishramnani: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/v4.5-integration-e2e | 7f879ba5b47249e1034c37adfe71f5de8f70de91 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/openshift_odo/3917/pull-ci-openshift-odo-master-v4.5-integration-e2e/1303663755376201728) | `/test v4.5-integration-e2e`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=openshift&repo=odo&pr=3917). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:girishramnani).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci-robot: @girishramnani: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/v4.5-integration-e2e | 7f879ba5b47249e1034c37adfe71f5de8f70de91 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/openshift_odo/3917/pull-ci-openshift-odo-master-v4.5-integration-e2e/1303663755376201728) | `/test v4.5-integration-e2e`
ci/prow/unit | 7f879ba5b47249e1034c37adfe71f5de8f70de91 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/openshift_odo/3917/pull-ci-openshift-odo-master-unit/1303663755183263744) | `/test unit`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=openshift&repo=odo&pr=3917). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:girishramnani).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/openshift/odo/pull/3917#issuecomment-689493054" title="Approved">dharmit</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=openshift%2Fodo).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[tests/OWNERS](https://github.com/openshift/odo/blob/master/tests/OWNERS)~~ [dharmit]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
girishramnani: /hold cancel
girishramnani: /test all
openshift-ci-robot: @girishramnani: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/v4.5-integration-e2e | c1bfc602f695576ce45ae7c99408b796d6112e68 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/openshift_odo/3917/pull-ci-openshift-odo-master-v4.5-integration-e2e/1304018387755601920) | `/test v4.5-integration-e2e`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=openshift&repo=odo&pr=3917). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:girishramnani).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
girishramnani: ```
msg="Error: [ERR]: Error building changeset: InvalidChangeBatch: [Tried to create resource record set [name='api.ci-op-mkvnyjxp-2f74e.origin-ci-int-aws.dev.rhcloud.com.', type='A'] but it already exists]"
level=error msg="\tstatus code: 400, request id: 3fcb7c32-1215-42b6-ac46-ff1df0b4999f"
level=error
level=error msg="  on ../tmp/openshift-install-253236301/route53/base.tf line 33, in resource \"aws_route53_record\" \"api_external\":"
level=error msg="  33: resource \"aws_route53_record\" \"api_external\" {"
level=error
level=error
level=fatal msg="failed to fetch Cluster: failed to generate asset \"Cluster\": failed to create cluster: failed to apply Terraform: failed to complete the change"
error: failed to execute wrapped command: exit status 1
```
infra issue
/retest
openshift-ci-robot: @girishramnani: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/v4.5-integration-e2e | c1bfc602f695576ce45ae7c99408b796d6112e68 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/openshift_odo/3917/pull-ci-openshift-odo-master-v4.5-integration-e2e/1304041588401377280) | `/test v4.5-integration-e2e`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=openshift&repo=odo&pr=3917). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:girishramnani).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/openshift/odo/pull/3917#issuecomment-689493054" title="Approved">dharmit</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign 
You can assign the PR to them by writing `/assign ` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=openshift%2Fodo).

<details open>
Needs approval from an approver in each of these files:


Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
openshift-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/openshift/odo/pull/3917#issuecomment-689493054" title="Approved">dharmit</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=openshift%2Fodo).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[tests/OWNERS](https://github.com/openshift/odo/blob/master/tests/OWNERS)~~ [dharmit]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->

Patch:
diff --git a/docs/public/community.adoc b/docs/public/community.adoc
index 17b68ef1f..2f7fd54a8 100644
--- a/docs/public/community.adoc
+++ b/docs/public/community.adoc
@@ -55,8 +55,7 @@ https://groups.google.com/forum/#!forum/odo-dev[odo-dev Google group].
 
 === Where do I start?
 
-odo is a complex project that touches both Kubernetes, OpenShift and
-Docker. We have a list of
+odo is a complex project that touches both Kubernetes and OpenShift. We have a list of
 https://github.com/openshift/odo/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22[good
 first issues] to help start.
 
diff --git a/docs/public/deploying-a-devfile-using-odo.adoc b/docs/public/deploying-a-devfile-using-odo.adoc
index df9883c0c..e04b3971b 100644
--- a/docs/public/deploying-a-devfile-using-odo.adoc
+++ b/docs/public/deploying-a-devfile-using-odo.adoc
@@ -10,7 +10,7 @@ With a devfile you can describe:
 * A list of pre-defined commands that can be run
 * Projects to initially clone
 
-odo takes this devfile and transforms it into a workspace of multiple containers running on OpenShift, Kubernetes or Docker.
+odo takes this devfile and transforms it into a workspace of multiple containers running on Kubernetes or OpenShift.
 
 Devfiles are YAML files with a defined https://devfile.github.io/devfile/_attachments/api-reference.html[schema].
 
diff --git a/docs/public/installing-odo.adoc b/docs/public/installing-odo.adoc
index 6fae53420..22ba7220b 100644
--- a/docs/public/installing-odo.adoc
+++ b/docs/public/installing-odo.adoc
@@ -1,8 +1,8 @@
 = Installing odo
 
-The following section describes how to install `odo` on different platforms using the CLI.
+The following section describes how to install `odo` on different platforms via CLI as well as IDEs.
 
-= Installing v2.0.0-beta-1 of odo
+= Installing the odo command-line tool (v2.0.0-beta-1)
 
 v2.0.0-beta-1 of odo uses **devfile** as its default deployment mechanism.
 
@@ -10,18 +10,20 @@ v2.0.0-beta-1 of odo uses **devfile** as its default deployment mechanism.
 
 === Binary installation
 
+[source,sh]
 ----
-# curl -L https://github.com/openshift/odo/releases/download/v2.0.0-beta-1/odo-linux-amd64 -o /usr/local/bin/odo
-# chmod +x /usr/local/bin/odo
+  # curl -L https://github.com/openshift/odo/releases/download/v2.0.0-beta-1/odo-linux-amd64 -o /usr/local/bin/odo
+  # chmod +x /usr/local/bin/odo
 ----
 
 == Installing odo on macOS
 
 === Binary installation
 
+[source,sh]
 ----
-# curl -L https://github.com/openshift/odo/releases/download/v2.0.0-beta-1/odo-darwin-amd64 -o /usr/local/bin/odo
-# chmod +x /usr/local/bin/odo
+  # curl -L https://github.com/openshift/odo/releases/download/v2.0.0-beta-1/odo-darwin-amd64 -o /usr/local/bin/odo
+  # chmod +x /usr/local/bin/odo
 ----
 
 == Installing odo on Windows
@@ -51,8 +53,17 @@ The following example demonstrates how to set up a path variable. Your binaries
 . Select *Path* from the *Variable* section and click *Edit*.
 . Click *New* and type `C:\go-bin` into the field or click *Browse* and select the directory, and click *OK*.
 
-= Installing v1.2.5 of odo
+= Installing odo in Visual Studio Code (VSCode)
 
-v1.2.5 of odo uses **Source-to-Image** as its default deployment mechanism.
+The https://marketplace.visualstudio.com/items?itemName=redhat.vscode-openshift-connector[OpenShift VSCode extension] uses both `odo` and the `oc` binary to interact with your Kubernetes or OpenShift cluster.
 
-Visit the latest link:https://docs.openshift.com/container-platform/4.5/cli_reference/developer_cli_odo/installing-odo.html[OpenShift documentation] for installation details.
+== Plugin installation
+
+. Launch VS Code Quick Open (Ctrl+P)
+
+. Paste the following command:
++
+[source,sh]
+----
+  $ ext install redhat.vscode-openshift-connector
+----
diff --git a/docs/public/s2i-to-devfile.adoc b/docs/public/s2i-to-devfile.adoc
new file mode 100644
index 000000000..7d619251b
--- /dev/null
+++ b/docs/public/s2i-to-devfile.adoc
@@ -0,0 +1,90 @@
+== Migrating from S2I (Source-to-Image) components to Devfile components
+
+https://devfile.github.io/[Devfiles] are new way of deploying component with odo.
+
+Existing users using S2I based components can migrate to a devfile component by following the below steps:
+
+. Change to the component directory you want to migrate:
++
+[source,sh]
+----
+ $ cd <directory-name>
+----
+
+. List the component status 
++
+[source,sh]
+----
+ $ odo list
+
+Openshift Components: 
+APP     NAME      PROJECT        TYPE       SOURCETYPE     STATE
+app     myapp     myproject      nodejs     local          Pushed
+
+----
+
+. Convert the S2I component to a devfile component by running the following command:
++
+[source,sh]
+----
+ $ odo utils convert-to-devfile
+ 
+ devfile.yaml is available in the current directory.
+
+----
+
+. Push the newly generated devfile component:
++
+[source,sh]
+----
+ $ odo push 
+ 
+ Validation
+  ✓  Validating the devfile [40136ns]
+
+ Creating Kubernetes resources for component myapp
+  ✓  Waiting for component to start [12s]
+
+ Applying URL changes
+  ✓  URL myapp-8080: http://myapp-8080-example.com/ created
+
+ Syncing to component myapp
+  ✓  Checking files for pushing [499419ns]
+  ✓  Syncing files to the component [155ms]
+
+ Executing devfile commands for component myapp
+  ✓  Executing s2i-assemble command "/opt/odo/bin/s2i-setup && /opt/odo/bin/assemble-and-restart" [47s]
+  ✓  Executing s2i-run command "/opt/odo/bin/run" [1s]
+
+ Pushing devfile component myapp
+  ✓  Changes successfully pushed to component
+
+----
+
+. Check the component status, there should be two components running both S2I and devfile:
++
+[source,sh]
+----
+ $ odo list 
+ 
+ Devfile Components: 
+ APP     NAME      PROJECT        TYPE      STATE
+ app     myapp     myproject      myapp     Pushed
+
+ Openshift Components: 
+ APP     NAME      PROJECT        TYPE       SOURCETYPE     STATE
+ app     myapp     myproject      nodejs     local          Pushed
+----
+
+. Delete the unused S2I component:
+
++
+[source,sh]
+----
+ $ odo delete --s2i --all --force
+ ✓  Deleting component myapp [277ms]
+ ✓  Component myapp from application app has been deleted
+ ✓  Config for the Component myapp has been deleted
+
+----
+
diff --git a/go.mod b/go.mod
index 4e6c85b1f..17cbed70a 100644
--- a/go.mod
+++ b/go.mod
@@ -58,6 +58,7 @@ require (
 )
 
 replace (
+	bitbucket.org/ww/goautoneg => github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d
 	github.com/apcera/gssapi => github.com/openshift/gssapi v0.0.0-20161010215902-5fb4217df13b
 	github.com/containers/image => github.com/openshift/containers-image v0.0.0-20190130162819-76de87591e9d
 	github.com/docker/docker => github.com/docker/docker v17.12.0-ce-rc1.0.20200309214505-aa6a9891b09c+incompatible
diff --git a/go.sum b/go.sum
index c9960a8c9..239000769 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,4 @@
 bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM=
-bitbucket.org/ww/goautoneg v0.0.0-20120707110453-75cd24fc2f2c/go.mod h1:1vhO7Mn/FZMgOgDVGLy5X1mE6rq1HbkBdkF/yj8zkcg=
 bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
diff --git a/pkg/envinfo/envinfo.go b/pkg/envinfo/envinfo.go
index 102d3ac02..979ff5cad 100644
--- a/pkg/envinfo/envinfo.go
+++ b/pkg/envinfo/envinfo.go
@@ -19,7 +19,7 @@ import (
 type ComponentSettings struct {
 	Name string `yaml:"Name,omitempty"`
 
-	Namespace   string              `yaml:"Namespace,omitempty"`
+	Project     string              `yaml:"Project,omitempty"`
 	URL         *[]EnvInfoURL       `yaml:"Url,omitempty"`
 	PushCommand *EnvInfoPushCommand `yaml:"PushCommand,omitempty"`
 	// AppName is the application name. Application is a virtual concept present in odo used
@@ -208,9 +208,9 @@ func (esi *EnvSpecificInfo) SetConfiguration(parameter string, value interface{}
 		case "name":
 			val := value.(string)
 			esi.componentSettings.Name = val
-		case "namespace":
+		case "project":
 			val := value.(string)
-			esi.componentSettings.Namespace = val
+			esi.componentSettings.Project = val
 		case "debugport":
 			val, err := strconv.Atoi(value.(string))
 			if err != nil {
@@ -289,7 +289,7 @@ var (
 	// Mandatory parameters in the environment file (env.yaml)
 	manParams = []string{
 		"name",
-		"namespace",
+		"project",
 	}
 )
 
@@ -413,7 +413,7 @@ func (esi *EnvSpecificInfo) SetRunMode(runMode RUNMode) error {
 
 // GetNamespace returns component namespace
 func (ei *EnvInfo) GetNamespace() string {
-	return ei.componentSettings.Namespace
+	return ei.componentSettings.Project
 }
 
 // GetApplication returns the application name
@@ -434,10 +434,10 @@ const (
 	Name = "Name"
 	// NameDescription is the human-readable description for name setting
 	NameDescription = "Set this value to user-defined component name to specify the component name"
-	// Namespace is the name of the setting controlling the component namespace
-	Namespace = "Namespace"
-	// NamespaceDescription is the human-readable description for namespace setting
-	NamespaceDescription = "Set this value to user-defined namespace to let the component create under the namespace"
+	// Project is the name of the setting controlling the component project
+	Project = "Project"
+	// ProjectDescription is the human-readable description for project setting
+	ProjectDescription = "Set this value to user-defined project to let the component create under the project"
 	// DebugPort is the name of the setting controlling the component debug port
 	DebugPort = "DebugPort"
 	// DebugPortDescription s the human-readable description for debug port setting
@@ -459,7 +459,7 @@ const (
 var (
 	supportedLocalParameterDescriptions = map[string]string{
 		Name:      NameDescription,
-		Namespace: NamespaceDescription,
+		Project:   ProjectDescription,
 		DebugPort: DebugPortDescription,
 		URL:       URLDescription,
 		Push:      PushDescription,
diff --git a/pkg/kclient/pods.go b/pkg/kclient/pods.go
index 156f18ff2..654675c89 100644
--- a/pkg/kclient/pods.go
+++ b/pkg/kclient/pods.go
@@ -190,7 +190,7 @@ func (c *Client) GetOnePodFromSelector(selector string) (*corev1.Pod, error) {
 func (c *Client) GetPodLogs(podName, containerName string, followLog bool) (io.ReadCloser, error) {
 
 	// Set standard log options
-	podLogOptions := corev1.PodLogOptions{Follow: false}
+	podLogOptions := corev1.PodLogOptions{Follow: false, Container: containerName}
 
 	// If the log is being followed, set it to follow / don't wait
 	if followLog {
diff --git a/pkg/occlient/occlient.go b/pkg/occlient/occlient.go
index e533e1606..6bf4bcd48 100644
--- a/pkg/occlient/occlient.go
+++ b/pkg/occlient/occlient.go
@@ -601,7 +601,21 @@ func getExposedPortsFromISI(image *imagev1.ImageStreamImage) ([]corev1.Container
 
 	var ports []corev1.ContainerPort
 
-	for exposedPort := range image.Image.DockerImageMetadata.Object.(*dockerapiv10.DockerImage).ContainerConfig.ExposedPorts {
+	var exposedPorts = image.Image.DockerImageMetadata.Object.(*dockerapiv10.DockerImage).ContainerConfig.ExposedPorts
+
+	if image.Image.DockerImageMetadata.Object.(*dockerapiv10.DockerImage).Config != nil {
+		if exposedPorts == nil {
+			exposedPorts = make(map[string]struct{})
+		}
+
+		// add ports from Config
+		for exposedPort := range image.Image.DockerImageMetadata.Object.(*dockerapiv10.DockerImage).Config.ExposedPorts {
+			var emptyStruct struct{}
+			exposedPorts[exposedPort] = emptyStruct
+		}
+	}
+
+	for exposedPort := range exposedPorts {
 		splits := strings.Split(exposedPort, "/")
 		if len(splits) != 2 {
 			return nil, fmt.Errorf("invalid port %s", exposedPort)
diff --git a/pkg/odo/cli/component/common_push.go b/pkg/odo/cli/component/common_push.go
index bfdd34e27..a15416850 100644
--- a/pkg/odo/cli/component/common_push.go
+++ b/pkg/odo/cli/component/common_push.go
@@ -358,7 +358,7 @@ func retrieveKubernetesDefaultNamespace() (string, error) {
 	return client.Namespace, nil
 }
 
-// retrieveCmdNamespace retrieves the namespace from project or namespace, if neither of those are available
+// retrieveCmdNamespace retrieves the namespace from project flag, if unset
 // we revert to the default namespace available from Kubernetes
 func retrieveCmdNamespace(cmd *cobra.Command) (string, error) {
 	var componentNamespace string
@@ -370,12 +370,6 @@ func retrieveCmdNamespace(cmd *cobra.Command) (string, error) {
 		if err != nil {
 			return "", err
 		}
-	} else if cmd.Flags().Changed("namespace") {
-		// For "odo push" check to see if project has been passed
-		componentNamespace, err = cmd.Flags().GetString("namespace")
-		if err != nil {
-			return "", err
-		}
 	} else {
 		componentNamespace, err = retrieveKubernetesDefaultNamespace()
 		if err != nil {
diff --git a/pkg/odo/cli/component/create.go b/pkg/odo/cli/component/create.go
index 0cccd4229..457250424 100644
--- a/pkg/odo/cli/component/create.go
+++ b/pkg/odo/cli/component/create.go
@@ -1077,9 +1077,9 @@ func (co *CreateOptions) devfileRun() (err error) {
 
 	// Generate env file
 	err = co.EnvSpecificInfo.SetComponentSettings(envinfo.ComponentSettings{
-		Name:      co.devfileMetadata.componentName,
-		Namespace: co.devfileMetadata.componentNamespace,
-		AppName:   co.appName,
+		Name:    co.devfileMetadata.componentName,
+		Project: co.devfileMetadata.componentNamespace,
+		AppName: co.appName,
 	})
 	if err != nil {
 		return errors.Wrap(err, "failed to create env file for devfile component")
diff --git a/pkg/odo/cli/component/push.go b/pkg/odo/cli/component/push.go
index 36602b081..97a79e322 100644
--- a/pkg/odo/cli/component/push.go
+++ b/pkg/odo/cli/component/push.go
@@ -125,7 +125,7 @@ func (po *PushOptions) Complete(name string, cmd *cobra.Command, args []string)
 			}
 
 			// Create the environment file. This will actually *create* the env.yaml file in your context directory.
-			err = envFileInfo.SetComponentSettings(envinfo.ComponentSettings{Name: name, Namespace: namespace})
+			err = envFileInfo.SetComponentSettings(envinfo.ComponentSettings{Name: name, Project: namespace})
 			if err != nil {
 				return errors.Wrap(err, "failed to create env.yaml for devfile component")
 			}
@@ -245,7 +245,6 @@ func NewCmdPush(name, fullName string) *cobra.Command {
 	pushCmd.Flags().BoolVar(&po.pushSource, "source", false, "Use source flag to only push latest source on to cluster")
 	pushCmd.Flags().BoolVarP(&po.forceBuild, "force-build", "f", false, "Use force-build flag to re-sync the entire source code and re-build the component")
 
-	pushCmd.Flags().StringVar(&po.namespace, "namespace", "", "Namespace to push the component to")
 	pushCmd.Flags().StringVar(&po.devfileInitCommand, "init-command", "", "Devfile Init Command to execute")
 	pushCmd.Flags().StringVar(&po.devfileBuildCommand, "build-command", "", "Devfile Build Command to execute")
 	pushCmd.Flags().StringVar(&po.devfileRunCommand, "run-command", "", "Devfile Run Command to execute")
diff --git a/pkg/odo/cli/debug/debug.go b/pkg/odo/cli/debug/debug.go
index b945192de..08d0fc8a5 100644
--- a/pkg/odo/cli/debug/debug.go
+++ b/pkg/odo/cli/debug/debug.go
@@ -1,8 +1,11 @@
 package debug
 
 import (
+	"fmt"
+
 	"github.com/openshift/odo/pkg/odo/util"
 	"github.com/spf13/cobra"
+	ktemplates "k8s.io/kubectl/pkg/util/templates"
 )
 
 const (
@@ -12,9 +15,7 @@ const (
 	devfile = "devfile.yaml"
 )
 
-var DebugLongDesc = `Warning - Debug is currently in tech preview and hence is subject to change in future.
-
-Debug allows you to remotely debug your application`
+var debugLongDesc = ktemplates.LongDesc(`Debug allows you to remotely debug your application.`)
 
 func NewCmdDebug(name, fullName string) *cobra.Command {
 
@@ -22,9 +23,12 @@ func NewCmdDebug(name, fullName string) *cobra.Command {
 	infoCmd := NewCmdInfo(infoCommandName, util.GetFullName(fullName, infoCommandName))
 
 	debugCmd := &cobra.Command{
-		Use:     name,
-		Short:   "Debug commands",
-		Long:    DebugLongDesc,
+		Use:   name,
+		Short: "Debug commands",
+		Example: fmt.Sprintf("%s\n\n%s",
+			portforwardCmd.Example,
+			infoCmd.Example),
+		Long:    debugLongDesc,
 		Aliases: []string{"d"},
 	}
 
diff --git a/pkg/odo/cli/debug/portforward.go b/pkg/odo/cli/debug/portforward.go
index 28a33d868..14a2f409c 100644
--- a/pkg/odo/cli/debug/portforward.go
+++ b/pkg/odo/cli/debug/portforward.go
@@ -45,10 +45,7 @@ type PortForwardOptions struct {
 }
 
 var (
-	portforwardLong = templates.LongDesc(`
-			Forward a local port to a remote port on the pod where the application is listening for a debugger.
-
-			By default the local port and the remote port will be same. To change the local port you can use --local-port argument and to change the remote port use "odo config set DebugPort <port>"   		  
+	portforwardLong = templates.LongDesc(`Forward a local port to a remote port on the pod where the application is listening for a debugger. By default the local port and the remote port will be same. To change the local port you can use --local-port argument and to change the remote port use "odo env set DebugPort <port>"   		  
 	`)
 
 	portforwardExample = templates.Examples(`
diff --git a/pkg/odo/cli/env/env.go b/pkg/odo/cli/env/env.go
index 2d31d7ea7..fdbad02d2 100644
--- a/pkg/odo/cli/env/env.go
+++ b/pkg/odo/cli/env/env.go
@@ -17,8 +17,8 @@ const RecommendedCommandName = "env"
 const (
 	nameParameter                 = "Name"
 	nameParameterDescription      = "Use this value to set component name"
-	namespaceParameter            = "Namespace"
-	namespaceParameterDescription = "Use this value to set component namespace"
+	projectParameter              = "Project"
+	projectParameterDescription   = "Use this value to set component project"
 	debugportParameter            = "DebugPort"
 	debugportParameterDescription = "Use this value to set component debug port"
 )
diff --git a/pkg/odo/cli/env/set.go b/pkg/odo/cli/env/set.go
index 39edad82f..e84df934e 100644
--- a/pkg/odo/cli/env/set.go
+++ b/pkg/odo/cli/env/set.go
@@ -33,7 +33,7 @@ var (
 var (
 	supportedSetParameters = map[string]string{
 		nameParameter:      nameParameterDescription,
-		namespaceParameter: namespaceParameterDescription,
+		projectParameter:   projectParameterDescription,
 		debugportParameter: debugportParameterDescription,
 	}
 )
@@ -95,7 +95,7 @@ func (o *SetOptions) Run() (err error) {
 	}
 
 	log.Info("Environment was successfully updated")
-	if strings.ToLower(o.paramName) == "name" || strings.ToLower(o.paramName) == "namespace" {
+	if strings.ToLower(o.paramName) == "name" || strings.ToLower(o.paramName) == "project" {
 		log.Warningf("Updated %q would create a new component", o.paramName)
 	}
 
@@ -110,7 +110,7 @@ func NewCmdSet(name, fullName string) *cobra.Command {
 		Short: "Set a value in odo environment file",
 		Long:  setLongDesc + printSupportedParameters(supportedSetParameters),
 		Example: fmt.Sprintf(fmt.Sprint(setExample), fullName,
-			envinfo.Name, envinfo.Namespace, envinfo.DebugPort),
+			envinfo.Name, envinfo.Project, envinfo.DebugPort),
 		Args: func(cmd *cobra.Command, args []string) error {
 			if len(args) < 2 {
 				return fmt.Errorf("please provide a parameter name and value")
diff --git a/pkg/odo/cli/env/view.go b/pkg/odo/cli/env/view.go
index f063b1be8..e8cd30281 100644
--- a/pkg/odo/cli/env/view.go
+++ b/pkg/odo/cli/env/view.go
@@ -62,7 +62,7 @@ func (o *ViewOptions) Run() (err error) {
 	w := tabwriter.NewWriter(os.Stdout, 5, 2, 2, ' ', tabwriter.TabIndent)
 	fmt.Fprintln(w, "PARAMETER NAME", "\t", "PARAMETER VALUE")
 	fmt.Fprintln(w, "Name", "\t", cs.Name)
-	fmt.Fprintln(w, "Namespace", "\t", cs.Namespace)
+	fmt.Fprintln(w, "Project", "\t", cs.Project)
 	fmt.Fprintln(w, "DebugPort", "\t", showBlankIfNil(cs.DebugPort))
 	w.Flush()
 
diff --git a/pkg/odo/cli/url/describe.go b/pkg/odo/cli/url/describe.go
deleted file mode 100644
index fa9f13ae7..000000000
--- a/pkg/odo/cli/url/describe.go
+++ /dev/null
@@ -1,205 +0,0 @@
-package url
-
-import (
-	"fmt"
-	"os"
-	"path/filepath"
-	"strconv"
-	"text/tabwriter"
-
-	routev1 "github.com/openshift/api/route/v1"
-	"github.com/openshift/odo/pkg/config"
-	"github.com/openshift/odo/pkg/devfile"
-	adaptersCommon "github.com/openshift/odo/pkg/devfile/adapters/common"
-	"github.com/openshift/odo/pkg/envinfo"
-	"github.com/openshift/odo/pkg/lclient"
-	"github.com/openshift/odo/pkg/log"
-	"github.com/openshift/odo/pkg/machineoutput"
-	"github.com/openshift/odo/pkg/occlient"
-	"github.com/openshift/odo/pkg/odo/cli/component"
-	"github.com/openshift/odo/pkg/odo/genericclioptions"
-	odoutil "github.com/openshift/odo/pkg/odo/util"
-	"github.com/openshift/odo/pkg/odo/util/completion"
-	"github.com/openshift/odo/pkg/odo/util/pushtarget"
-	"github.com/openshift/odo/pkg/url"
-	"github.com/openshift/odo/pkg/util"
-	"github.com/pkg/errors"
-	"github.com/spf13/cobra"
-	ktemplates "k8s.io/kubectl/pkg/util/templates"
-)
-
-// DescribeRecommendedCommandName is the recommended describe command name
-const describeRecommendedCommandName = "describe"
-
-var describeExample = ktemplates.Examples(`  # Describe a URL
-%[1]s myurl
-`)
-
-// URLDescribeOptions encapsulates the options for the odo url describe command
-type URLDescribeOptions struct {
-	localConfigInfo  *config.LocalConfigInfo
-	componentContext string
-	url              string
-	*genericclioptions.Context
-	devfilePath string
-	isDevFile   bool
-}
-
-// NewURLDescribeOptions creates a new NewURLDescribeOptions instance
-func NewURLDescribeOptions() *URLDescribeOptions {
-	return &URLDescribeOptions{&config.LocalConfigInfo{}, "", "", &genericclioptions.Context{}, "", false}
-}
-
-// Complete completes URLDescribeOptions after they've been Listed
-func (o *URLDescribeOptions) Complete(name string, cmd *cobra.Command, args []string) (err error) {
-	o.devfilePath = filepath.Join(o.componentContext, component.DevfilePath)
-
-	if util.CheckPathExists(o.devfilePath) {
-		o.Context = genericclioptions.NewDevfileContext(cmd)
-		o.EnvSpecificInfo, err = envinfo.NewEnvSpecificInfo(o.componentContext)
-	} else {
-		o.Context = genericclioptions.NewContext(cmd)
-		o.localConfigInfo, err = config.NewLocalConfigInfo(o.componentContext)
-	}
-	if err != nil {
-		return errors.Wrap(err, "failed intiating local config")
-	}
-	o.url = args[0]
-	return
-}
-
-// Validate validates the URLDescribeOptions based on completed values
-func (o *URLDescribeOptions) Validate() (err error) {
-	return odoutil.CheckOutputFlag(o.OutputFlag)
-}
-
-// Run contains the logic for the odo url describe command
-func (o *URLDescribeOptions) Run() (err error) {
-	if util.CheckPathExists(o.devfilePath) {
-		if pushtarget.IsPushTargetDocker() {
-			client, err := lclient.New()
-			if err != nil {
-				return err
-			}
-			u, err := url.GetContainerURL(client, o.EnvSpecificInfo, o.url, o.EnvSpecificInfo.GetName())
-			if err != nil {
-				return err
-			}
-
-			if log.IsJSON() {
-				machineoutput.OutputSuccess(u)
-			} else {
-				tabWriterURL := tabwriter.NewWriter(os.Stdout, 5, 2, 3, ' ', tabwriter.TabIndent)
-				fmt.Fprintln(tabWriterURL, "NAME", "\t", "STATE", "\t", "URL", "\t", "PORT")
-				var urlString string
-				if u.Status.State == url.StateTypeNotPushed {
-					// to be consistent with URL for ingress and routes
-					// if not pushed, display URl as ://
-					urlString = "://"
-				} else {
-					urlString = fmt.Sprintf("%s:%s", u.Spec.Host, strconv.Itoa(u.Spec.ExternalPort))
-				}
-				// are there changes between local and cluster states?
-				outOfSync := false
-				fmt.Fprintln(tabWriterURL, u.Name, "\t", u.Status.State, "\t", urlString, "\t", u.Spec.Port)
-				if u.Status.State != url.StateTypePushed {
-					outOfSync = true
-				}
-				tabWriterURL.Flush()
-				if outOfSync {
-					log.Info("There are local changes. Please run 'odo push'.")
-				}
-			}
-		} else {
-			componentName := o.EnvSpecificInfo.GetName()
-			oclient, err := occlient.New()
-			if err != nil {
-				return err
-			}
-			oclient.Namespace = o.KClient.Namespace
-			routeSupported, err := oclient.IsRouteSupported()
-			if err != nil {
-				return err
-			}
-
-			devObj, err := devfile.ParseAndValidate(o.devfilePath)
-			if err != nil {
-				return errors.Wrap(err, "fail to parse the devfile")
-			}
-			containerComponents := adaptersCommon.GetDevfileContainerComponents(devObj.Data)
-			u, err := url.GetIngressOrRoute(oclient, o.KClient, o.EnvSpecificInfo, o.url, containerComponents, componentName, routeSupported)
-			if err != nil {
-				return err
-			}
-			if log.IsJSON() {
-				machineoutput.OutputSuccess(u)
-			} else {
-				tabWriterURL := tabwriter.NewWriter(os.Stdout, 5, 2, 3, ' ', tabwriter.TabIndent)
-				fmt.Fprintln(tabWriterURL, "NAME", "\t", "STATE", "\t", "URL", "\t", "PORT", "\t", "SECURE", "\t", "KIND")
-
-				// are there changes between local and cluster states?
-				outOfSync := false
-				if u.Spec.Kind == envinfo.ROUTE {
-					fmt.Fprintln(tabWriterURL, u.Name, "\t", u.Status.State, "\t", url.GetURLString(u.Spec.Protocol, u.Spec.Host, "", false), "\t", u.Spec.Port, "\t", u.Spec.Secure, "\t", u.Spec.Kind)
-				} else {
-					fmt.Fprintln(tabWriterURL, u.Name, "\t", u.Status.State, "\t", url.GetURLString(url.GetProtocol(routev1.Route{}, url.ConvertIngressURLToIngress(u, componentName)), "", u.Spec.Host, false), "\t", u.Spec.Port, "\t", u.Spec.Secure, "\t", u.Spec.Kind)
-				}
-				if u.Status.State != url.StateTypePushed {
-					outOfSync = true
-				}
-				tabWriterURL.Flush()
-				if outOfSync {
-					log.Info("There are local changes. Please run 'odo push'.")
-				}
-			}
-		}
-	} else {
-		u, err := url.Get(o.Client, o.localConfigInfo, o.url, o.Application)
-		if err != nil {
-			return err
-		}
-
-		if log.IsJSON() {
-			machineoutput.OutputSuccess(u)
-		} else {
-
-			tabWriterURL := tabwriter.NewWriter(os.Stdout, 5, 2, 3, ' ', tabwriter.TabIndent)
-			fmt.Fprintln(tabWriterURL, "NAME", "\t", "STATE", "\t", "URL", "\t", "PORT")
-
-			// are there changes between local and cluster states?
-			outOfSync := false
-			fmt.Fprintln(tabWriterURL, u.Name, "\t", u.Status.State, "\t", url.GetURLString(u.Spec.Protocol, u.Spec.Host, "", false), "\t", u.Spec.Port)
-			if u.Status.State != url.StateTypePushed {
-				outOfSync = true
-			}
-			tabWriterURL.Flush()
-			if outOfSync {
-				log.Info("There are local changes. Please run 'odo push'.")
-			}
-		}
-	}
-
-	return
-}
-
-// NewCmdURLDescribe implements the odo url describe command.
-func NewCmdURLDescribe(name, fullName string) *cobra.Command {
-	o := NewURLDescribeOptions()
-	urlDescribeCmd := &cobra.Command{
-		Use:         name + " [url name]",
-		Short:       "Describe a URL",
-		Long:        `Describe a URL`,
-		Example:     fmt.Sprintf(describeExample, fullName),
-		Args:        cobra.ExactArgs(1),
-		Annotations: map[string]string{"machineoutput": "json", "command": "url"},
-		Run: func(cmd *cobra.Command, args []string) {
-			genericclioptions.GenericRun(o, cmd, args)
-		},
-	}
-	urlDescribeCmd.SetUsageTemplate(odoutil.CmdUsageTemplate)
-	genericclioptions.AddContextFlag(urlDescribeCmd, &o.componentContext)
-	completion.RegisterCommandHandler(urlDescribeCmd, completion.URLCompletionHandler)
-	completion.RegisterCommandFlagHandler(urlDescribeCmd, "context", completion.FileCompletionHandler)
-
-	return urlDescribeCmd
-}
diff --git a/pkg/odo/cli/url/url.go b/pkg/odo/cli/url/url.go
index 19babb234..f8fed463e 100644
--- a/pkg/odo/cli/url/url.go
+++ b/pkg/odo/cli/url/url.go
@@ -24,22 +24,21 @@ func NewCmdURL(name, fullName string) *cobra.Command {
 	urlCreateCmd := NewCmdURLCreate(createRecommendedCommandName, odoutil.GetFullName(fullName, createRecommendedCommandName))
 	urlDeleteCmd := NewCmdURLDelete(deleteRecommendedCommandName, odoutil.GetFullName(fullName, deleteRecommendedCommandName))
 	urlListCmd := NewCmdURLList(listRecommendedCommandName, odoutil.GetFullName(fullName, listRecommendedCommandName))
-	urlDescribeCmd := NewCmdURLDescribe(describeRecommendedCommandName, odoutil.GetFullName(fullName, describeRecommendedCommandName))
 	urlCmd := &cobra.Command{
 		Use:   name,
 		Short: urlShortDesc,
 		Long:  urlLongDesc,
-		Example: fmt.Sprintf("%s\n\n%s\n\n%s\n\n%s",
+		Example: fmt.Sprintf("%s\n\n%s\n\n%s",
 			urlCreateCmd.Example,
 			urlDeleteCmd.Example,
 			urlListCmd.Example,
-			urlDescribeCmd.Example),
+		),
 	}
 
 	// Add a defined annotation in order to appear in the help menu
 	urlCmd.Annotations = map[string]string{"command": "main"}
 	urlCmd.SetUsageTemplate(odoutil.CmdUsageTemplate)
-	urlCmd.AddCommand(urlCreateCmd, urlDeleteCmd, urlListCmd, urlDescribeCmd)
+	urlCmd.AddCommand(urlCreateCmd, urlDeleteCmd, urlListCmd)
 
 	return urlCmd
 }
diff --git a/pkg/odo/cli/utils/convert.go b/pkg/odo/cli/utils/convert.go
index 91ec3d317..fc9f286cc 100644
--- a/pkg/odo/cli/utils/convert.go
+++ b/pkg/odo/cli/utils/convert.go
@@ -230,9 +230,9 @@ func generateEnvYaml(co *ConvertOptions) (err error) {
 	}
 
 	componentSettings := envinfo.ComponentSettings{
-		Name:      co.componentName,
-		Namespace: co.context.Project,
-		AppName:   application,
+		Name:    co.componentName,
+		Project: co.context.Project,
+		AppName: application,
 	}
 
 	if debugPort != 0 || debugPort == config.DefaultDebugPort {
diff --git a/pkg/url/url.go b/pkg/url/url.go
index ae2535464..6466c7976 100644
--- a/pkg/url/url.go
+++ b/pkg/url/url.go
@@ -49,47 +49,6 @@ func (urls URLList) Get(urlName string) URL {
 
 }
 
-// Get returns URL definition for given URL name
-func Get(client *occlient.Client, localConfig *config.LocalConfigInfo, urlName string, applicationName string) (URL, error) {
-	remoteUrlName, err := util.NamespaceOpenShiftObject(urlName, applicationName)
-	if err != nil {
-		return URL{}, errors.Wrapf(err, "unable to create namespaced name")
-	}
-
-	// Check whether remote already created the route
-	remoteExist := true
-	route, err := client.GetRoute(remoteUrlName)
-	if err != nil {
-		remoteExist = false
-	}
-
-	localConfigURLs := localConfig.GetURL()
-	for _, configURL := range localConfigURLs {
-		localURL := ConvertConfigURL(configURL)
-		// search local URL, if it exist in local, update state with remote status
-		if localURL.Name == urlName {
-			if remoteExist {
-				clusterURL := getMachineReadableFormat(*route)
-				clusterURL.Status.State = StateTypePushed
-				return clusterURL, nil
-			} else {
-				localURL.Status.State = StateTypeNotPushed
-				return localURL, nil
-			}
-		}
-	}
-
-	if err == nil && remoteExist {
-		// Remote exist, but not in local, so it's deleted status
-		clusterURL := getMachineReadableFormat(*route)
-		clusterURL.Status.State = StateTypeLocallyDeleted
-		return clusterURL, nil
-	}
-
-	// can't find the URL in local and remote
-	return URL{}, errors.New(fmt.Sprintf("the url %v does not exist", urlName))
-}
-
 // GetIngressOrRoute returns ingress/route spec for given URL name
 func GetIngressOrRoute(client *occlient.Client, kClient *kclient.Client, envSpecificInfo *envinfo.EnvSpecificInfo, urlName string, containerComponents []common.DevfileComponent, componentName string, routeSupported bool) (URL, error) {
 	remoteExist := true
@@ -190,62 +149,6 @@ func GetIngressOrRoute(client *occlient.Client, kClient *kclient.Client, envSpec
 	return URL{}, errors.New(fmt.Sprintf("the url %v does not exist", urlName))
 }
 
-// GetContainer returns Docker URL definition for given URL name
-func GetContainerURL(client *lclient.Client, envSpecificInfo *envinfo.EnvSpecificInfo, urlName string, componentName string) (URL, error) {
-	localURLs := envSpecificInfo.GetURL()
-	containers, err := dockerutils.GetComponentContainers(*client, componentName)
-	if err != nil {
-		return URL{}, errors.Wrap(err, "unable to get component containers")
-	}
-	var remoteExist = false
-	var dockerURL URL
-	// iterating through each container's HostConfig, generate and cache the dockerURL if found a match urlName
-	for _, c := range containers {
-		containerJSON, err := client.Client.ContainerInspect(client.Context, c.ID)
-		if err != nil {
-			return URL{}, err
-		}
-		for internalPort, portbinding := range containerJSON.HostConfig.PortBindings {
-			remoteURLName := containerJSON.Config.Labels[internalPort.Port()]
-			if remoteURLName != urlName {
-				continue
-			}
-			// found urlName in Docker container's config
-			remoteExist = true
-			externalport, err := strconv.Atoi(portbinding[0].HostPort)
-			if err != nil {
-				return URL{}, err
-			}
-			dockerURL = getMachineReadableFormatDocker(internalPort.Int(), externalport, portbinding[0].HostIP, remoteURLName)
-		}
-	}
-
-	// iterating through URLs in local env.yaml
-	for _, localurl := range localURLs {
-		if localurl.Kind != envinfo.DOCKER || localurl.Name != urlName {
-			continue
-		}
-		localURL := getMachineReadableFormatDocker(localurl.Port, localurl.ExposedPort, dockercomponent.LocalhostIP, localurl.Name)
-		// found urlName in local env file
-		if remoteExist {
-			// URL is in both env file and Docker HostConfig
-			localURL.Status.State = StateTypePushed
-			return localURL, nil
-		} else {
-			// URL only exists in local env file
-			localURL.Status.State = StateTypeNotPushed
-			return localURL, nil
-		}
-	}
-	// URL only exists in pushed Docker container
-	if remoteExist {
-		dockerURL.Status.State = StateTypeLocallyDeleted
-		return dockerURL, nil
-	}
-	// can't find the URL in local env.yaml or Docker containers
-	return URL{}, errors.New(fmt.Sprintf("the url %v does not exist", urlName))
-}
-
 // Delete deletes a URL
 func Delete(client *occlient.Client, kClient *kclient.Client, urlName string, applicationName string, urlType envinfo.URLKind) error {
 	if urlType == envinfo.INGRESS {


Test patch:
diff --git a/pkg/occlient/occlient_test.go b/pkg/occlient/occlient_test.go
index 13ffd5534..4ffe26a5a 100644
--- a/pkg/occlient/occlient_test.go
+++ b/pkg/occlient/occlient_test.go
@@ -1412,17 +1412,112 @@ func TestGetExposedPorts(t *testing.T) {
 		want             []corev1.ContainerPort
 	}{
 		{
-			name:             "Case: Valid image ports",
-			imageTag:         "3.5",
-			imageStreamImage: fakeImageStreamImage("python", []string{"8080/tcp"}, ""),
+			name:     "Case: Valid image ports in ContainerConfig",
+			imageTag: "3.5",
+			imageStreamImage: &imagev1.ImageStreamImage{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "name/imagename@@sha256:9579a93ee",
+				},
+				Image: imagev1.Image{
+					ObjectMeta: metav1.ObjectMeta{
+						Name: "@sha256:9579a93ee",
+					},
+					DockerImageMetadata: runtime.RawExtension{
+						Object: &dockerapiv10.DockerImage{
+							ContainerConfig: dockerapiv10.DockerConfig{
+								ExposedPorts: map[string]struct{}{
+									"8080/tcp": {},
+								},
+							},
+						},
+					},
+				},
+			},
+			want: []corev1.ContainerPort{
+				{
+					Name:          "8080-tcp",
+					ContainerPort: 8080,
+					Protocol:      "TCP",
+				},
+			},
+		},
+		{
+			name:     "Case: Valid image ports in Config",
+			imageTag: "3.5",
+			imageStreamImage: &imagev1.ImageStreamImage{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "name/imagename@@sha256:9579a93ee",
+				},
+				Image: imagev1.Image{
+					ObjectMeta: metav1.ObjectMeta{
+						Name: "@sha256:9579a93ee",
+					},
+					DockerImageMetadata: runtime.RawExtension{
+						Object: &dockerapiv10.DockerImage{
+							Config: &dockerapiv10.DockerConfig{
+								ExposedPorts: map[string]struct{}{
+									"8080/tcp": {},
+								},
+							},
+						},
+					},
+				},
+			},
 			want: []corev1.ContainerPort{
 				{
-					Name:          fmt.Sprintf("%d-%s", 8080, strings.ToLower(string("tcp"))),
+					Name:          "8080-tcp",
 					ContainerPort: 8080,
 					Protocol:      "TCP",
 				},
 			},
 		},
+		{
+			name:     "Case: Valid image ports in both Config and ContainerConfig",
+			imageTag: "3.5",
+			imageStreamImage: &imagev1.ImageStreamImage{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "name/imagename@@sha256:9579a93ee",
+				},
+				Image: imagev1.Image{
+					ObjectMeta: metav1.ObjectMeta{
+						Name: "@sha256:9579a93ee",
+					},
+					DockerImageMetadata: runtime.RawExtension{
+						Object: &dockerapiv10.DockerImage{
+							ContainerConfig: dockerapiv10.DockerConfig{
+								ExposedPorts: map[string]struct{}{
+									"8080/tcp": {},
+									"9090/tcp": {},
+								},
+							},
+							Config: &dockerapiv10.DockerConfig{
+								ExposedPorts: map[string]struct{}{
+									"9090/tcp": {},
+									"9191/tcp": {},
+								},
+							},
+						},
+					},
+				},
+			},
+			want: []corev1.ContainerPort{
+				{
+					Name:          "8080-tcp",
+					ContainerPort: 8080,
+					Protocol:      "TCP",
+				},
+				{
+					Name:          "9090-tcp",
+					ContainerPort: 9090,
+					Protocol:      "TCP",
+				},
+				{
+					Name:          "9191-tcp",
+					ContainerPort: 9191,
+					Protocol:      "TCP",
+				},
+			},
+		},
 		{
 			name:             "Case: Invalid image tag",
 			imageTag:         "0.1",
@@ -1436,6 +1531,11 @@ func TestGetExposedPorts(t *testing.T) {
 			fkclient.Namespace = "testing"
 			got, err := fkclient.GetExposedPorts(tt.imageStreamImage)
 
+			// sort result, map is used behind the scene so the ordering might be different
+			sort.Slice(got, func(i, j int) bool {
+				return got[i].ContainerPort < got[j].ContainerPort
+			})
+
 			if !tt.wantErr == (err != nil) {
 				t.Errorf("client.GetExposedPorts(imagestream imageTag) unexpected error %v, wantErr %v", err, tt.wantErr)
 			}
diff --git a/pkg/odo/cli/env/env_test.go b/pkg/odo/cli/env/env_test.go
index 878a5a47c..d7919bfc4 100644
--- a/pkg/odo/cli/env/env_test.go
+++ b/pkg/odo/cli/env/env_test.go
@@ -10,14 +10,14 @@ import (
 func TestPrintSupportedParameters(t *testing.T) {
 	supportedSetParameters := map[string]string{
 		nameParameter:      nameParameterDescription,
-		namespaceParameter: namespaceParameterDescription,
+		projectParameter:   projectParameterDescription,
 		debugportParameter: debugportParameterDescription,
 	}
 
 	wantSetParameters := `Available parameters:
   DebugPort: Use this value to set component debug port
   Name: Use this value to set component name
-  Namespace: Use this value to set component namespace`
+  Project: Use this value to set component project`
 
 	supportedUnsetParameters := map[string]string{
 		debugportParameter: debugportParameterDescription,
diff --git a/pkg/url/url_test.go b/pkg/url/url_test.go
index b5d85d265..95a841dd2 100644
--- a/pkg/url/url_test.go
+++ b/pkg/url/url_test.go
@@ -1977,98 +1977,6 @@ func TestListDockerURL(t *testing.T) {
 	}
 }
 
-func TestGetContainerURL(t *testing.T) {
-	fakeClient := lclient.FakeNew()
-	fakeErrorClient := lclient.FakeErrorNew()
-	testURL1 := envinfo.EnvInfoURL{Name: "testurl1", Port: 8080, ExposedPort: 56789, Kind: "docker"}
-	testURL2 := envinfo.EnvInfoURL{Name: "testurl2", Port: 8080, ExposedPort: 54321, Kind: "docker"}
-	testURL3 := envinfo.EnvInfoURL{Name: "testurl3", Port: 8080, ExposedPort: 65432, Kind: "docker"}
-	esi := &envinfo.EnvSpecificInfo{}
-	err := esi.SetConfiguration("url", testURL1)
-	if err != nil {
-		// discard the error, since no physical file to write
-		t.Log("Expected error since no physical env file to write")
-	}
-	err = esi.SetConfiguration("url", testURL2)
-	if err != nil {
-		// discard the error, since no physical file to write
-		t.Log("Expected error since no physical env file to write")
-	}
-	tests := []struct {
-		name      string
-		client    *lclient.Client
-		component string
-		urlName   string
-		wantURL   URL
-		wantErr   bool
-	}{
-		{
-			name:      "Case 1: Successfully retrieve the not pushed URL object",
-			client:    fakeClient,
-			component: "golang",
-			urlName:   testURL1.Name,
-			wantURL: URL{
-				TypeMeta:   metav1.TypeMeta{Kind: "url", APIVersion: "odo.dev/v1alpha1"},
-				ObjectMeta: metav1.ObjectMeta{Name: testURL1.Name},
-				Spec:       URLSpec{Host: dockercomponent.LocalhostIP, Port: testURL1.Port, ExternalPort: testURL1.ExposedPort},
-				Status: URLStatus{
-					State: StateTypeNotPushed,
-				},
-			},
-			wantErr: false,
-		},
-		{
-			name:      "Case 2: Successfully retrieve the pushed URL object",
-			client:    fakeClient,
-			component: "golang",
-			urlName:   testURL2.Name,
-			wantURL: URL{
-				TypeMeta:   metav1.TypeMeta{Kind: "url", APIVersion: "odo.dev/v1alpha1"},
-				ObjectMeta: metav1.ObjectMeta{Name: testURL2.Name},
-				Spec:       URLSpec{Host: dockercomponent.LocalhostIP, Port: testURL2.Port, ExternalPort: testURL2.ExposedPort},
-				Status: URLStatus{
-					State: StateTypePushed,
-				},
-			},
-			wantErr: false,
-		},
-		{
-			name:      "Case 3: Successfully retrieve the locally deleted URL object",
-			client:    fakeClient,
-			component: "golang",
-			urlName:   testURL3.Name,
-			wantURL: URL{
-				TypeMeta:   metav1.TypeMeta{Kind: "url", APIVersion: "odo.dev/v1alpha1"},
-				ObjectMeta: metav1.ObjectMeta{Name: testURL3.Name},
-				Spec:       URLSpec{Host: dockercomponent.LocalhostIP, Port: testURL3.Port, ExternalPort: testURL3.ExposedPort},
-				Status: URLStatus{
-					State: StateTypeLocallyDeleted,
-				},
-			},
-			wantErr: false,
-		},
-		{
-			name:      "Case 4: Error retrieving the URL object",
-			client:    fakeErrorClient,
-			component: "golang",
-			urlName:   "",
-			wantURL:   URL{},
-			wantErr:   true,
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			url, err := GetContainerURL(fakeClient, esi, tt.urlName, tt.component)
-			if !tt.wantErr == (err != nil) {
-				t.Errorf("expected %v, got %v", tt.wantErr, err)
-			}
-			if !reflect.DeepEqual(url, tt.wantURL) {
-				t.Errorf("Expected %v, got %v", tt.wantURL, url)
-			}
-		})
-	}
-}
-
 func TestListIngressAndRoute(t *testing.T) {
 	componentName := "testcomponent"
 	containerName := "testcontainer"
diff --git a/tests/integration/cmd_url_test.go b/tests/integration/cmd_url_test.go
index 3c7bbf4bc..81a1f38d8 100644
--- a/tests/integration/cmd_url_test.go
+++ b/tests/integration/cmd_url_test.go
@@ -95,47 +95,6 @@ var _ = Describe("odo url command tests", func() {
 		})
 	})
 
-	Context("Describing urls", func() {
-		It("should describe appropriate URLs and push message", func() {
-			var stdout string
-			url1 := helper.RandString(5)
-			componentName := helper.RandString(6)
-			helper.CmdShouldPass("odo", "create", "--s2i", "nodejs", "--context", context, "--project", project, componentName, "--ref", "master", "--git", "https://github.com/openshift/nodejs-ex", "--port", "8080,8000")
-
-			helper.CmdShouldPass("odo", "url", "create", url1, "--port", "8080", "--context", context)
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1, "--context", context)
-			helper.MatchAllInOutput(stdout, []string{url1, "Not Pushed", url1, "odo push"})
-
-			helper.CmdShouldPass("odo", "push", "--context", context)
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1, "--context", context)
-			helper.MatchAllInOutput(stdout, []string{url1, "Pushed"})
-			helper.DontMatchAllInOutput(stdout, []string{"Not Pushed", "odo push"})
-
-			helper.CmdShouldPass("odo", "url", "delete", url1, "-f", "--context", context)
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1, "--context", context)
-			helper.MatchAllInOutput(stdout, []string{url1, "Locally Deleted", url1, "odo push"})
-		})
-
-		It("should be able to describe a url in CLI format and machine readable json format for a secure url", func() {
-			helper.CmdShouldPass("odo", "create", "--s2i", "nodejs", "nodejs", "--app", "myapp", "--project", project, "--git", "https://github.com/openshift/nodejs-ex", "--context", context)
-			helper.CmdShouldPass("odo", "url", "create", "myurl", "--secure", "--context", context)
-
-			actualURLDescribeJSON := helper.CmdShouldPass("odo", "url", "describe", "myurl", "-o", "json", "--context", context)
-			desiredURLDescribeJSON := `{"kind":"url","apiVersion":"odo.dev/v1alpha1","metadata":{ "name": "myurl","creationTimestamp": null},"spec":{"port": 8080,"secure": true,"path": "/", "kind": "route"},"status": {"state": "Not Pushed"}}`
-			Expect(desiredURLDescribeJSON).Should(MatchJSON(actualURLDescribeJSON))
-
-			helper.CmdShouldPass("odo", "push", "--context", context)
-
-			// odo url describe -o json
-			actualURLDescribeJSON = helper.CmdShouldPass("odo", "url", "describe", "myurl", "-o", "json", "--context", context)
-			// get the route URL
-			fullURLPath := helper.DetermineRouteURL(context)
-			pathNoHTTP := strings.Split(fullURLPath, "//")[1]
-			desiredURLDescribeJSON = fmt.Sprintf(`{"kind":"url","apiVersion":"odo.dev/v1alpha1","metadata":{ "name": "myurl","creationTimestamp": null},"spec":{"host":"%s","protocol": "https","port": 8080,"secure": true, "path": "/", "kind": "route"},"status": {"state": "Pushed"}}`, pathNoHTTP)
-			Expect(desiredURLDescribeJSON).Should(MatchJSON(actualURLDescribeJSON))
-		})
-	})
-
 	Context("when listing urls using -o json flag", func() {
 		JustBeforeEach(func() {
 			originalDir = helper.Getwd()
diff --git a/tests/integration/devfile/cmd_devfile_env_test.go b/tests/integration/devfile/cmd_devfile_env_test.go
index 690062590..ddb05e9dd 100644
--- a/tests/integration/devfile/cmd_devfile_env_test.go
+++ b/tests/integration/devfile/cmd_devfile_env_test.go
@@ -13,7 +13,7 @@ import (
 var _ = Describe("odo devfile env command tests", func() {
 	const (
 		testName      = "testname"
-		testNamepace  = "testNamepace"
+		testProject   = "testProject"
 		testDebugPort = "8888"
 		fakeParameter = "fakeParameter"
 	)
@@ -54,7 +54,7 @@ var _ = Describe("odo devfile env command tests", func() {
 				"PARAMETER VALUE",
 				"NAME",
 				"nodejs",
-				"Namespace",
+				"Project",
 				project,
 				"DebugPort",
 			}
@@ -66,7 +66,7 @@ var _ = Describe("odo devfile env command tests", func() {
 		It("Should successfully set and unset the parameters", func() {
 			helper.CmdShouldPass("odo", "create", "nodejs")
 			helper.CmdShouldPass("odo", "env", "set", "Name", testName, "-f")
-			helper.CmdShouldPass("odo", "env", "set", "Namespace", testNamepace, "-f")
+			helper.CmdShouldPass("odo", "env", "set", "Project", testProject, "-f")
 			helper.CmdShouldPass("odo", "env", "set", "DebugPort", testDebugPort, "-f")
 			output := helper.CmdShouldPass("odo", "env", "view")
 			wantOutput := []string{
@@ -74,8 +74,8 @@ var _ = Describe("odo devfile env command tests", func() {
 				"PARAMETER VALUE",
 				"NAME",
 				testName,
-				"Namespace",
-				testNamepace,
+				"Project",
+				testProject,
 				"DebugPort",
 				testDebugPort,
 			}
diff --git a/tests/integration/devfile/cmd_devfile_log_test.go b/tests/integration/devfile/cmd_devfile_log_test.go
index cce392311..f19368d04 100644
--- a/tests/integration/devfile/cmd_devfile_log_test.go
+++ b/tests/integration/devfile/cmd_devfile_log_test.go
@@ -12,8 +12,7 @@ import (
 )
 
 var _ = Describe("odo devfile log command tests", func() {
-	var namespace, context, cmpName, currentWorkingDirectory, originalKubeconfig, projectDirPath string
-	var projectDir = "/projectDir"
+	var namespace, context, cmpName, currentWorkingDirectory, originalKubeconfig string
 	// Using program commmand according to cliRunner in devfile
 	cliRunner := helper.GetCliRunner()
 
@@ -29,7 +28,6 @@ var _ = Describe("odo devfile log command tests", func() {
 		currentWorkingDirectory = helper.Getwd()
 		cmpName = helper.RandString(6)
 		helper.Chdir(context)
-		projectDirPath = context + projectDir
 	})
 
 	// Clean up after the test
@@ -45,16 +43,18 @@ var _ = Describe("odo devfile log command tests", func() {
 
 	Context("Verify odo log for devfile works", func() {
 
-		It("should log run command output", func() {
-			helper.MakeDir(projectDirPath)
-			helper.Chdir(projectDirPath)
+		It("should log run command output and fail for debug command", func() {
 
-			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, cmpName)
-			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), projectDirPath)
-			helper.CmdShouldPass("odo", "push", "--project", namespace)
-			output := helper.CmdShouldPass("odo", "log")
+			helper.CmdShouldPass("odo", "create", "java-springboot", "--project", namespace, cmpName, "--context", context)
+			helper.CopyExample(filepath.Join("source", "devfiles", "springboot", "project"), context)
+			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "springboot", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
+			helper.CmdShouldPass("odo", "push", "--context", context)
+			output := helper.CmdShouldPass("odo", "log", "--context", context)
 			Expect(output).To(ContainSubstring("ODO_COMMAND_RUN"))
 
+			// It should fail for debug command as no debug command in devfile
+			helper.CmdShouldFail("odo", "log", "--debug")
+
 			/*
 				Flaky Test odo log -f, see issue https://github.com/openshift/odo/issues/3809
 				match, err := helper.RunCmdWithMatchOutputFromBuffer(30*time.Second, "program=devrun", "odo", "log", "-f")
@@ -65,21 +65,21 @@ var _ = Describe("odo devfile log command tests", func() {
 		})
 
 		It("should error out if component does not exist", func() {
-			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, cmpName)
+			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, cmpName, "--context", context)
 			helper.CmdShouldFail("odo", "log")
 		})
 
 		It("should log debug command output", func() {
 
-			helper.CmdShouldPass("git", "clone", "https://github.com/che-samples/web-nodejs-sample.git", projectDirPath)
-			helper.Chdir(projectDirPath)
+			projectDir := filepath.Join(context, "projectDir")
 
-			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, cmpName)
-			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs"), projectDirPath)
-			helper.RenameFile("devfile-with-debugrun.yaml", "devfile.yaml")
-			helper.CmdShouldPass("odo", "push", "--debug")
+			helper.CmdShouldPass("git", "clone", "https://github.com/che-samples/web-nodejs-sample.git", projectDir)
 
-			output := helper.CmdShouldPass("odo", "log", "--debug")
+			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, cmpName, "--context", projectDir)
+			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-debugrun.yaml"), filepath.Join(projectDir, "devfile.yaml"))
+			helper.CmdShouldPass("odo", "push", "--debug", "--context", projectDir)
+
+			output := helper.CmdShouldPass("odo", "log", "--debug", "--context", projectDir)
 			Expect(output).To(ContainSubstring("ODO_COMMAND_DEBUG"))
 
 			/*
@@ -91,16 +91,6 @@ var _ = Describe("odo devfile log command tests", func() {
 
 		})
 
-		// we do not need test for run command as odo push fails
-		// if there is no run command in devfile.
-		It("should give error if no debug command in devfile", func() {
-
-			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
-			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace)
-			helper.CmdShouldPass("odo", "push", "--project", namespace)
-			helper.CmdShouldFail("odo", "log", "--debug")
-		})
-
 	})
 
 })
diff --git a/tests/integration/devfile/cmd_devfile_push_test.go b/tests/integration/devfile/cmd_devfile_push_test.go
index 49d0d86d0..bfb59ba96 100644
--- a/tests/integration/devfile/cmd_devfile_push_test.go
+++ b/tests/integration/devfile/cmd_devfile_push_test.go
@@ -58,7 +58,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "springboot", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "springboot", "devfile-with-metadataname-foobar.yaml"), filepath.Join(context, "devfile.yaml"))
 
-			output := helper.CmdShouldPass("odo", "push", "--namespace", namespace)
+			output := helper.CmdShouldPass("odo", "push", "--project", namespace)
 			Expect(output).To(ContainSubstring("Executing devfile commands for component " + name))
 		})
 
@@ -67,12 +67,12 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "springboot", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "springboot", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
 
-			output := helper.CmdShouldPass("odo", "push", "--namespace", namespace, name)
+			output := helper.CmdShouldPass("odo", "push", "--project", namespace, name)
 			Expect(output).To(ContainSubstring("Executing devfile commands for component " + name))
 		})
 
 		It("should error out on devfile flag", func() {
-			helper.CmdShouldFail("odo", "push", "--namespace", namespace, "--devfile", "invalid.yaml")
+			helper.CmdShouldFail("odo", "push", "--project", namespace, "--devfile", "invalid.yaml")
 		})
 
 	})
@@ -386,7 +386,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-valid-events.yaml"), filepath.Join(context, "devfile.yaml"))
 
-			output := helper.CmdShouldPass("odo", "push", "--namespace", namespace)
+			output := helper.CmdShouldPass("odo", "push", "--project", namespace)
 			helper.MatchAllInOutput(output, []string{"PreStart commands have been added to the component"})
 
 			firstPushPodName := cliRunner.GetRunningPodNameByComponent(cmpName, namespace)
@@ -397,7 +397,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.MatchAllInOutput(strings.Join(firstPushInitContainers, ","), expectedInitContainers)
 
 			// Need to force so build and run get triggered again with the component already created.
-			output = helper.CmdShouldPass("odo", "push", "--namespace", namespace, "-f")
+			output = helper.CmdShouldPass("odo", "push", "--project", namespace, "-f")
 			helper.MatchAllInOutput(output, []string{"PreStart commands have been added to the component"})
 
 			secondPushPodName := cliRunner.GetRunningPodNameByComponent(cmpName, namespace)
@@ -442,11 +442,11 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-valid-events.yaml"), filepath.Join(context, "devfile.yaml"))
 
-			output := helper.CmdShouldPass("odo", "push", "--namespace", namespace)
+			output := helper.CmdShouldPass("odo", "push", "--project", namespace)
 			helper.MatchAllInOutput(output, []string{"Executing mypoststart command \"echo I am a PostStart\"", "Executing secondpoststart command \"echo I am also a PostStart\""})
 
 			// Need to force so build and run get triggered again with the component already created.
-			output = helper.CmdShouldPass("odo", "push", "--namespace", namespace, "-f")
+			output = helper.CmdShouldPass("odo", "push", "--project", namespace, "-f")
 			helper.DontMatchAllInOutput(output, []string{"Executing mypoststart command \"echo I am a PostStart\"", "Executing secondpoststart command \"echo I am also a PostStart\""})
 			helper.MatchAllInOutput(output, []string{
 				"Executing devbuild command",
@@ -462,7 +462,7 @@ var _ = Describe("odo devfile push command tests", func() {
 
 			helper.ReplaceString("devfile.yaml", "secondpoststart", "secondpoststart12345")
 
-			output := helper.CmdShouldFail("odo", "push", "--namespace", namespace)
+			output := helper.CmdShouldFail("odo", "push", "--project", namespace)
 			helper.MatchAllInOutput(output, []string{"does not map to a valid devfile command"})
 		})
 
@@ -475,7 +475,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.ReplaceString("devfile.yaml", "secondpoststart", "wrongPostStart")
 			helper.ReplaceString("devfile.yaml", "runtime #wrongruntime", "wrongruntime")
 
-			output := helper.CmdShouldFail("odo", "push", "--namespace", namespace)
+			output := helper.CmdShouldFail("odo", "push", "--project", namespace)
 			helper.MatchAllInOutput(output, []string{"the command \"wrongpoststart\" does not map to a container component"})
 		})
 
@@ -488,7 +488,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.ReplaceString("devfile.yaml", "secondpoststart", "myWrongCompCmd")
 			helper.ReplaceString("devfile.yaml", "secondPreStop #secondPreStopisWrong", "secondPreStopisWrong")
 
-			output := helper.CmdShouldFail("odo", "push", "--namespace", namespace)
+			output := helper.CmdShouldFail("odo", "push", "--project", namespace)
 			helper.MatchAllInOutput(output, []string{"does not exist in the devfile"})
 		})
 
@@ -538,9 +538,9 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-hotReload.yaml"), filepath.Join(context, "devfile.yaml"))
 
-			helper.CmdShouldPass("odo", "push", "--namespace", namespace)
+			helper.CmdShouldPass("odo", "push", "--project", namespace)
 
-			helper.CmdShouldPass("odo", "push", "--debug", "--namespace", namespace)
+			helper.CmdShouldPass("odo", "push", "--debug", "--project", namespace)
 
 			logs := helper.CmdShouldPass("odo", "log")
 
@@ -557,13 +557,13 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-debugrun.yaml"), filepath.Join(context, "devfile.yaml"))
 
-			output := helper.CmdShouldPass("odo", "push", "--debug", "--namespace", namespace)
+			output := helper.CmdShouldPass("odo", "push", "--debug", "--project", namespace)
 			helper.MatchAllInOutput(output, []string{
 				"Executing devbuild command",
 				"Executing debugrun command",
 			})
 
-			output = helper.CmdShouldPass("odo", "push", "--namespace", namespace)
+			output = helper.CmdShouldPass("odo", "push", "--project", namespace)
 			helper.MatchAllInOutput(output, []string{
 				"Executing devbuild command",
 				"Executing devrun command",
@@ -577,7 +577,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-volumes.yaml"), filepath.Join(context, "devfile.yaml"))
 
-			output := helper.CmdShouldPass("odo", "push", "--namespace", namespace)
+			output := helper.CmdShouldPass("odo", "push", "--project", namespace)
 			helper.MatchAllInOutput(output, []string{
 				"Executing devbuild command",
 				"Executing devrun command",
@@ -637,7 +637,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "springboot", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "springboot", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
 
-			output := helper.CmdShouldPass("odo", "push", "--namespace", namespace)
+			output := helper.CmdShouldPass("odo", "push", "--project", namespace)
 			Expect(output).To(ContainSubstring("Changes successfully pushed to component"))
 
 			// 2) Rename the pom.xml, which should cause the build to fail if sync is working as expected
@@ -646,7 +646,7 @@ var _ = Describe("odo devfile push command tests", func() {
 
 			// 3) Ensure that the build fails due to missing 'pom.xml', which ensures that the sync operation
 			// correctly renamed pom.xml to pom.xml.renamed.
-			output = helper.CmdShouldFail("odo", "push", "-f", "--namespace", namespace)
+			output = helper.CmdShouldFail("odo", "push", "-f", "--project", namespace)
 			helper.MatchAllInOutput(output, []string{"no POM in this directory"})
 		})
 
@@ -662,12 +662,12 @@ var _ = Describe("odo devfile push command tests", func() {
 			fmt.Fprintf(GinkgoWriter, "Testing with force push %v", shouldForcePush)
 
 			// 1) Push a standard spring boot project
-			output := helper.CmdShouldPass("odo", "push", "--namespace", namespace)
+			output := helper.CmdShouldPass("odo", "push", "--project", namespace)
 			Expect(output).To(ContainSubstring("Changes successfully pushed to component"))
 
 			// 2) Update the devfile.yaml, causing push to redeploy the component
 			helper.ReplaceString("devfile.yaml", "memoryLimit: 768Mi", "memoryLimit: 769Mi")
-			commands := []string{"push", "-v", "4", "--namespace", namespace}
+			commands := []string{"push", "-v", "4", "--project", namespace}
 			if shouldForcePush {
 				// Test both w/ and w/o '-f'
 				commands = append(commands, "-f")
@@ -822,7 +822,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, cmpName)
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-multiple-defaults.yaml"), filepath.Join(context, "devfile.yaml"))
-			output := helper.CmdShouldPass("odo", "push", "--build-command", "firstbuild", "--run-command", "singleenv", "--namespace", namespace, "--context", context)
+			output := helper.CmdShouldPass("odo", "push", "--build-command", "firstbuild", "--run-command", "singleenv", "--context", context)
 			Expect(output).To(ContainSubstring("mkdir $ENV1"))
 
 			podName := cliRunner.GetRunningPodNameByComponent(cmpName, namespace)
@@ -835,7 +835,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, cmpName)
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-multiple-defaults.yaml"), filepath.Join(context, "devfile.yaml"))
-			output := helper.CmdShouldPass("odo", "push", "--build-command", "firstbuild", "--run-command", "multipleenv", "--namespace", namespace, "--context", context)
+			output := helper.CmdShouldPass("odo", "push", "--build-command", "firstbuild", "--run-command", "multipleenv", "--context", context)
 			Expect(output).To(ContainSubstring("mkdir $ENV1 $ENV2"))
 
 			podName := cliRunner.GetRunningPodNameByComponent(cmpName, namespace)
@@ -848,7 +848,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, cmpName)
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-multiple-defaults.yaml"), filepath.Join(context, "devfile.yaml"))
-			output := helper.CmdShouldPass("odo", "push", "--build-command", "firstbuild", "--run-command", "envwithspace", "--namespace", namespace, "--context", context)
+			output := helper.CmdShouldPass("odo", "push", "--build-command", "firstbuild", "--run-command", "envwithspace", "--context", context)
 			Expect(output).To(ContainSubstring("mkdir \\\"$ENV1\\\""))
 
 			podName := cliRunner.GetRunningPodNameByComponent(cmpName, namespace)
@@ -866,7 +866,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			// devfile with clonePath set in project field
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-projects.yaml"), filepath.Join(context, "devfile.yaml"))
 
-			helper.CmdShouldPass("odo", "push", "--namespace", namespace, "--context", context, "--v", "5")
+			helper.CmdShouldPass("odo", "push", "--context", context, "--v", "5")
 			podName := cliRunner.GetRunningPodNameByComponent(cmpName, namespace)
 			// source code is synced to $PROJECTS_ROOT/clonePath
 			// $PROJECTS_ROOT is /projects by default, if sourceMapping is set it is same as sourceMapping
@@ -885,7 +885,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.ReplaceString(filepath.Join(context, "devfile.yaml"), "clonePath: webapp/", "# clonePath: webapp/")
 			helper.ReplaceString(filepath.Join(context, "devfile.yaml"), "workingDir: ${PROJECTS_ROOT}/webapp", "workingDir: ${PROJECTS_ROOT}/nodeshift")
 
-			helper.CmdShouldPass("odo", "push", "--namespace", namespace, "--context", context)
+			helper.CmdShouldPass("odo", "push", "--context", context)
 
 			podName := cliRunner.GetRunningPodNameByComponent(cmpName, namespace)
 			output := cliRunner.ExecListDir(podName, namespace, "/apps/nodeshift")
@@ -897,7 +897,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile-with-multiple-projects.yaml"), filepath.Join(context, "devfile.yaml"))
-			helper.CmdShouldPass("odo", "push", "--namespace", namespace, "--context", context)
+			helper.CmdShouldPass("odo", "push", "--context", context)
 			podName := cliRunner.GetRunningPodNameByComponent(cmpName, namespace)
 			// for devfile-with-multiple-projects.yaml source mapping is not set so $PROJECTS_ROOT is /projects
 			// multiple projects, so source code would sync to /projects
@@ -910,7 +910,7 @@ var _ = Describe("odo devfile push command tests", func() {
 			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
 
 			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
-			helper.CmdShouldPass("odo", "push", "--namespace", namespace, "--context", context)
+			helper.CmdShouldPass("odo", "push", "--context", context)
 			podName := cliRunner.GetRunningPodNameByComponent(cmpName, namespace)
 			output := cliRunner.ExecListDir(podName, namespace, "/projects")
 			helper.MatchAllInOutput(output, []string{"package.json"})
diff --git a/tests/integration/devfile/cmd_devfile_url_test.go b/tests/integration/devfile/cmd_devfile_url_test.go
index fe96cc13c..0801c9f8e 100644
--- a/tests/integration/devfile/cmd_devfile_url_test.go
+++ b/tests/integration/devfile/cmd_devfile_url_test.go
@@ -45,23 +45,28 @@ var _ = Describe("odo devfile url command tests", func() {
 	})
 
 	Context("Listing urls", func() {
-		It("should list url after push", func() {
+		It("should list url after push using context", func() {
+			// to confirm that --context works we are using a subfolder of the context
+			subFolderContext := filepath.Join(context, helper.RandString(6))
+			helper.MakeDir(subFolderContext)
 			url1 := helper.RandString(5)
 			host := helper.RandString(5) + ".com"
 
-			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, componentName)
+			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, "--context", subFolderContext, componentName)
 
-			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
-			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
+			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), subFolderContext)
+			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile.yaml"), filepath.Join(subFolderContext, "devfile.yaml"))
 
-			stdout := helper.CmdShouldFail("odo", "url", "create", url1, "--port", "3000", "--ingress")
+			stdout := helper.CmdShouldFail("odo", "url", "create", url1, "--port", "3000", "--ingress", "--context", subFolderContext)
 			Expect(stdout).To(ContainSubstring("host must be provided"))
 
-			helper.CmdShouldPass("odo", "url", "create", url1, "--port", "3000", "--host", host, "--ingress")
-			stdout = helper.CmdShouldPass("odo", "push", "--project", namespace)
+			stdout = helper.CmdShouldFail("odo", "url", "create", url1, "--port", "3000", "--host", host, "--ingress")
+			Expect(stdout).To(ContainSubstring("The current directory does not represent an odo component"))
+			helper.CmdShouldPass("odo", "url", "create", url1, "--port", "3000", "--host", host, "--ingress", "--context", subFolderContext)
+			stdout = helper.CmdShouldPass("odo", "push", "--context", subFolderContext)
 			Expect(stdout).Should(ContainSubstring(url1 + "." + host))
 
-			stdout = helper.CmdShouldPass("odo", "url", "list", "--context", context)
+			stdout = helper.CmdShouldPass("odo", "url", "list", "--context", subFolderContext)
 			helper.MatchAllInOutput(stdout, []string{url1, "Pushed", "false", "ingress"})
 		})
 
@@ -264,55 +269,6 @@ var _ = Describe("odo devfile url command tests", func() {
 
 	})
 
-	Context("Describing urls", func() {
-		It("should describe appropriate Ingress URLs", func() {
-			url1 := helper.RandString(5)
-			host := helper.RandString(5) + ".com"
-
-			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, componentName)
-
-			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
-			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
-
-			helper.CmdShouldPass("odo", "url", "create", url1, "--port", "8080", "--host", host, "--ingress")
-
-			stdout := helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1 + "." + host, "Not Pushed", "false", "ingress", "odo push"})
-
-			helper.CmdShouldPass("odo", "push", "--project", namespace)
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1 + "." + host, "Pushed", "false", "ingress"})
-			helper.CmdShouldPass("odo", "url", "delete", url1, "-f")
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1 + "." + host, "Locally Deleted", "false", "ingress"})
-
-			helper.CmdShouldPass("odo", "url", "create", url1, "--port", "9090", "--host", host, "--secure", "--ingress")
-			helper.CmdShouldPass("odo", "push", "--project", namespace)
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1 + "." + host, "Pushed", "true", "ingress"})
-		})
-
-		It("should describe Ingress URL in json format", func() {
-			url1 := helper.RandString(5)
-			host := helper.RandString(5) + ".com"
-
-			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, componentName)
-
-			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
-			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
-			// remove the endpoint came with the devfile
-			// need to create an ingress to be more general for openshift/non-openshift cluster to run
-			helper.CmdShouldPass("odo", "url", "delete", "3000/tcp", "-f")
-			helper.CmdShouldPass("odo", "url", "create", url1, "--port", "3000", "--host", host, "--ingress")
-			helper.CmdShouldPass("odo", "push", "--project", namespace)
-
-			// odo url describe url1 -o json
-			stdout := helper.CmdShouldPass("odo", "url", "describe", url1, "-o", "json")
-			desiredURLListJSON := fmt.Sprintf(`{"kind":"url","apiVersion":"odo.dev/v1alpha1","metadata":{"name":"%s","creationTimestamp":null},"spec":{"host":"%s","port":3000,"secure": false,"path": "/", "kind":"ingress"},"status":{"state":"Pushed"}}`, url1, url1+"."+host)
-			Expect(desiredURLListJSON).Should(MatchJSON(stdout))
-		})
-	})
-
 	Context("Testing URLs for OpenShift specific scenarios", func() {
 		JustBeforeEach(func() {
 			if os.Getenv("KUBERNETES") == "true" {
@@ -401,32 +357,6 @@ var _ = Describe("odo devfile url command tests", func() {
 			Expect(output).Should(ContainSubstring("3000-tcp"))
 		})
 
-		It("should describe appropriate Route URLs", func() {
-			url1 := helper.RandString(5)
-
-			helper.CmdShouldPass("odo", "create", "nodejs", "--project", namespace, componentName)
-
-			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
-			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
-
-			helper.CmdShouldPass("odo", "url", "create", url1, "--port", "8080")
-
-			stdout := helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1, "Not Pushed", "false", "route", "odo push"})
-
-			helper.CmdShouldPass("odo", "push", "--project", namespace)
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1, "Pushed", "false", "route"})
-			helper.CmdShouldPass("odo", "url", "delete", url1, "-f")
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1, "Locally Deleted", "false", "route"})
-
-			helper.CmdShouldPass("odo", "url", "create", url1, "--port", "9090", "--secure")
-			helper.CmdShouldPass("odo", "push", "--project", namespace)
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1, "Pushed", "true", "route"})
-		})
-
 		It("should create a url for a unsupported devfile component", func() {
 			url1 := helper.RandString(5)
 
diff --git a/tests/integration/devfile/docker/cmd_docker_devfile_url_test.go b/tests/integration/devfile/docker/cmd_docker_devfile_url_test.go
index df6015d7d..897ab8872 100644
--- a/tests/integration/devfile/docker/cmd_docker_devfile_url_test.go
+++ b/tests/integration/devfile/docker/cmd_docker_devfile_url_test.go
@@ -155,51 +155,4 @@ var _ = Describe("odo docker devfile url command tests", func() {
 		})
 	})
 
-	Context("Describing urls", func() {
-		It("should describe URL with appropriate state", func() {
-			var stdout string
-			url1 := helper.RandString(5)
-			helper.CmdShouldPass("odo", "create", "nodejs", cmpName)
-
-			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
-			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
-
-			helper.CmdShouldPass("odo", "url", "create", url1)
-
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1, "Not Pushed"})
-
-			helper.CmdShouldPass("odo", "push")
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1, "Pushed"})
-
-			helper.CmdShouldPass("odo", "url", "delete", url1, "-f")
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1, "Locally Deleted"})
-		})
-
-		It("should be able to describe url in machine readable json format", func() {
-			var stdout string
-			url1 := helper.RandString(5)
-
-			helper.CmdShouldPass("odo", "create", "nodejs", cmpName)
-
-			helper.CopyExample(filepath.Join("source", "devfiles", "nodejs", "project"), context)
-			helper.CopyExampleDevFile(filepath.Join("source", "devfiles", "nodejs", "devfile.yaml"), filepath.Join(context, "devfile.yaml"))
-
-			stdout = helper.CmdShouldFail("odo", "url", "describe", url1)
-			Expect(stdout).To(ContainSubstring("the url " + url1 + " does not exist"))
-
-			httpPort, err := util.HTTPGetFreePort()
-			Expect(err).NotTo(HaveOccurred())
-			freePort := strconv.Itoa(httpPort)
-			helper.CmdShouldPass("odo", "url", "create", url1, "--exposed-port", freePort, "--now")
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1)
-			helper.MatchAllInOutput(stdout, []string{url1, "Pushed"})
-
-			desiredURLListJSON := fmt.Sprintf(`{"kind":"url","apiVersion":"odo.dev/v1alpha1","metadata":{"name":"%s","creationTimestamp":null},"spec":{"host":"127.0.0.1","port": 3000,"secure":false,"externalport":%s},"status":{"state":"Pushed"}}`, url1, freePort)
-			stdout = helper.CmdShouldPass("odo", "url", "describe", url1, "-o", "json")
-			Expect(desiredURLListJSON).Should(MatchJSON(stdout))
-		})
-	})
 })