Monday, October 16, 2023

Cassandra: nodetool: Failed to connect to 'IP-ADDRESS:7199' - ConnectException: 'Connection refused (Connection refused)'.

By default, Cassandra JMX listens to localhost only. When Cassandra started up, port 7199 was brought up on localhost. This issue has been bothering me for nearly 2 weeks until I read everything hint in the cassandra-env.sh and refer to this documentation  https://docs.datastax.com/en/cassandra-oss/3.x/cassandra/configuration/secureJmxAuthentication.html

 Hopefully, this blog will help someone with a similar issue. The ConnectException can be vague and refer to other issues. As far as I can tell, the same error message has 4 variants of different issues.

 

 

Note: anything connecting to JMX monitoring will fail with ConnectException

cassandra@cassandra01:/etc/cassandra$ nodetool -u cassandra -pw casspass -h 192.168.1.32 status

nodetool: Failed to connect to '102.10.10.91:7199' - ConnectException: 'Connection refused (Connection refused)'.

 

 

cassandra@cassandra01:/etc/cassandra$ nodetool -h 102.10.10.91 -p 7199  decommission

nodetool: Failed to connect to '102.10.10.91:7199' - ConnectException: 'Connection refused (Connection refused)'.

 

Further research showing Cassandra will only be brought up to localhost.

 

cassandra@cassandra01:/etc/cassandra$ lsof -i :7199

COMMAND  PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

java    1778 cassandra   95u  IPv4  28317      0t0  TCP localhost:7199 (LISTEN)

 

 

 

 

Here is how to resolve the issue.

 

 

in Cassandra-env.sh


Enable and set the port for JMS as 7199


 

Uncomment and insert the ip address

JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<Pubilc Address>"


TO


JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=102.10.10.91"

 

 

Change the yes as local to no, so it enables JMX remote connectivity.

 

if [ "x$LOCAL_JMX" = "x" ]; then

    LOCAL_JMX=yes

fi

 

TO 

 

if [ "x$LOCAL_JMX" = "x" ]; then

    LOCAL_JMX=no

fi

 

 

 

Change the remote authentication from false to true. All these have to be done in the set.  Changing on without the others will not work.


if [ "$LOCAL_JMX" = "yes" ]; then

  JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.local.port=$JMX_PORT"

  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"

else

 

TO

 

if [ "$LOCAL_JMX" = "yes" ]; then

  JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.local.port=$JMX_PORT"

  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=true"

else

 

 

Create and insert the following. This will allow the jmx to go to the file to grab the username and password. 

 

sudo vi /etc/cassandra/jmxremote.password

      cassandra casspass

 

chown cassandra:cassandra /etc/cassandra/jmxremote.password

sudo chown cassandra:cassandra /etc/cassandra/jmxremote.password

sudo chmod 400 /etc/cassandra/jmxremote.password

 

 

Restart Cassandra

cassandra@cassandra01:/etc/cassandra$ sudo service cassandra restart

 

 

Test the dedicated host connectivity with username and password


cassandra@cassandra01:/etc/cassandra$ nodetool -u cassandra -pw casspass -h 102.10.10.91 status

Datacenter: datacenter1

=======================

Status=Up/Down

|/ State=Normal/Leaving/Joining/Moving

--  Address       Load       Tokens  Owns (effective)  Host ID                               Rack 

UN  102/10/10.92  24.42 MiB  16      51.2%             d9d37072-817a-4095-87da-c4fc7a4686f8  rack1

UN  102.10.10.91  23.31 MiB  16      48.8%             37562f38-b9da-4e77-b44d-6572248ec7d1  rack1

 

 

It is no longer listening to only localhost.

cassandra@cassandra01:/etc/cassandra$ lsof -i :7199

COMMAND  PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

java    3293 cassandra   95u  IPv4  58397      0t0  TCP *:7199 (LISTEN)

 

 

Test without username and password will work as well.

cassandra@cassandra01:/etc/cassandra$ nodetool -h 102.10.10.91 cleanup



All JMX connectivities are working now.

 

Monday, October 2, 2023

Cassandra: com.datastax.driver.core.exceptions.InvalidQueryException: Keyspace 'keyspace1' does not exist


cassandra-stress read test failed with key space doesn't exist. 

 

cassandra-stress read n=200000 -node 192.168.1.32


Warming up READ with 50000 iterations...
Connected to cluster: Test Cluster, max pending requests per connection 128, max connections per host 8
Datacenter: datacenter1; Host: /192.168.1.32:9042; Rack: rack1
Datacenter: datacenter1; Host: /192.168.1.35:9042; Rack: rack1
Failed to connect over JMX; not collecting these stats
Connected to cluster: Test Cluster, max pending requests per connection 128, max connections per host 8
Datacenter: datacenter1; Host: /192.168.1.32:9042; Rack: rack1
Datacenter: datacenter1; Host: /192.168.1.35:9042; Rack: rack1
com.datastax.driver.core.exceptions.InvalidQueryException: Keyspace 'keyspace1' does not exist
Connected to cluster: Test Cluster, max pending requests per connection 128, max connections per host 8
Datacenter: datacenter1; Host: /192.168.1.32:9042; Rack: rack1
Datacenter: datacenter1; Host: /192.168.1.35:9042; Rack: rack1
com.datastax.driver.core.exceptions.InvalidQueryException: Keyspace 'keyspace1' does not exist
Connected to cluster: Test Cluster, max pending requests per connection 128, max connections per host 8
......................................
...........................
......................

Failed to create client too many times
Failed to create client too many times
Failed to create client too many times
Failed to create client too many times
Failed to create client too many times
Failed to create client too many times
Failed to create client too many times
Failed to create client too many times
Failed to create client too many times

....................



It failed because a new environment needs to run Write, so it creates all the necessary keyspaces and tables before reading. Once that's done, the Read will work.


cassandra-stress write  n=200000 -node 192.168.1.32











Friday, September 29, 2023

Cassandra: nodetool: Failed to connect to '127.0.0.1:7199' - ConnectException: 'Connection refused (Connection refused)'

 


I encountered a Cassandra start-up issue after adding a node, specifically after inserting the seed. Restoring the cassandra.yaml couldn't return to its original situation as things have been cached. The VMs had to be restored with snapshots. The node stays up on its own only briefly and then died down with the following error "nodetool: Failed to connect to '127.0.0.1:7199' - ConnectException: 'Connection refused (Connection refused)'"



cassandra@cassandra:~$ nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address    Load        Tokens  Owns (effective)  Host ID                               Rack 
UN  127.0.0.1  228.44 KiB  16      100.0%            37562f38-b9da-4e77-b44d-6572248ec7d1  rack1



As soon as seeds are added to the cassandra.yaml,  the nodes died.

cassandra@cassandra02:~$ nodetool status
nodetool: Failed to connect to '127.0.0.1:7199' - ConnectException: 'Connection refused (Connection refused)'


system.log show the following.
Gossiper.java:2142 - No local state, state is in silent shutdown, or node hasn't joined, not announcing shutdown


I did not clear out the node2 Cassandra data I cloned from node1. Once deleted the data and restarted Cassandra, it came back up. Since node2 was cloned from node1 and its data, it caused a synching issue and refused to start up.

cassandra@cassandra02:/var/log/cassandra$ ls -las /var/lib/cassandra/
total 24
4 drwxr-xr-x 6 cassandra cassandra 4096 Aug 15 16:39 .
4 drwxr-xr-x 42 root root 4096 Aug 15 16:39 ..
4 drwxr-xr-x 2 cassandra cassandra 4096 Sep 29 16:36 commitlog
4 drwxr-xr-x 8 cassandra cassandra 4096 Aug 17 21:18 data
4 drwxr-xr-x 2 cassandra cassandra 4096 Aug 15 16:39 hints
4 drwxr-xr-x 2 cassandra cassandra 4096 Sep 28 16:31 saved_caches


cassandra@cassandra02:/var/log/cassandra$ sudo service cassandra stop 

cassandra@cassandra02:/var/log/cassandra$ sudo rm -rf /var/lib/cassandra/*

cassandra@cassandra02:/var/log/cassandra$ sudo service cassandra start


cassandra@cassandra02:/var/log/cassandra$ nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack 
UN 192.168.1.32 265 KiB 16 100.0% 37562f38-b9da-4e77-b44d-6572248ec7d1 rack1

cassandra@cassandra02:/var/log/cassandra$ nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack 
UN 192.168.1.35 79.81 KiB 16 51.2% d9d37072-817a-4095-87da-c4fc7a4686f8 rack1
UN 192.168.1.32 265 KiB 16 48.8% 37562f38-b9da-4e77-b44d-6572248ec7d1 rack1

Had tried the following through google, but I need help with it.


It isn't the JMX issue. 
1.$JVM_OPTS -Djava.rmi.server.hostname=127.0.0.1 in cassandra-env.sh

It isn't the Ubuntu firewall UFW issue. It is disabled.

sudo UFW disable 

It isn't the 2 gig memory issue.

Cassandra: How to tell where the data resides and on which nodes.

 


cqlsh:linkedin> select * from location;

 vehicle_id | date       | time                            | latitude | longtitude
------------+------------+---------------------------------+----------+------------
   ME100AAS | 2014-05-19 | 2014-05-19 08:50:00.000000+0000 | 44.74941 |   -67.2507
   ME100AAS | 2014-05-19 | 2014-05-19 08:40:00.000000+0000 | 44.74648 |  -67.26444
   ME100AAS | 2014-05-19 | 2014-05-19 08:30:00.000000+0000 | 44.74258 |  -67.34272
   ME100AAS | 2014-05-19 | 2014-05-19 08:20:00.000000+0000 | 44.72795 |  -67.40177
   ME100AAS | 2014-05-19 | 2014-05-19 08:10:00.000000+0000 | 44.69965 |  -67.47043
   ME100AAS | 2014-05-19 | 2014-05-19 08:00:00.000000+0000 | 44.61909 |   -67.8462
   WA063JXD | 2014-05-19 | 2014-05-19 08:50:00.000000+0000 | 47.70144 | -117.01791
   WA063JXD | 2014-05-19 | 2014-05-19 08:40:00.000000+0000 | 47.69589 | -117.04126
   WA063JXD | 2014-05-19 | 2014-05-19 08:30:00.000000+0000 | 47.68711 |  -117.0701
   WA063JXD | 2014-05-19 | 2014-05-19 08:20:00.000000+0000 | 47.68017 | -117.08932
   WA063JXD | 2014-05-19 | 2014-05-19 08:10:00.000000+0000 | 47.67093 | -117.10924
   WA063JXD | 2014-05-19 | 2014-05-19 08:00:00.000000+0000 | 47.67547 | -117.23619
  CA6AFL218 | 2014-05-19 | 2014-05-19 08:50:00.000000+0000 | 36.11959 | -115.17258
  CA6AFL218 | 2014-05-19 | 2014-05-19 08:40:00.000000+0000 | 36.04423 | -115.18112
  CA6AFL218 | 2014-05-19 | 2014-05-19 08:30:00.000000+0000 | 35.91153 | -115.20631
  CA6AFL218 | 2014-05-19 | 2014-05-19 08:20:00.000000+0000 | 35.88326 | -115.22528
  CA6AFL218 | 2014-05-19 | 2014-05-19 08:10:00.000000+0000 | 35.76301 | -115.33514
  CA6AFL218 | 2014-05-19 | 2014-05-19 08:00:00.000000+0000 | 35.69166 |  -115.3681


cqlsh:linkedin> desc table location

CREATE TABLE linkedin.location (
vehicle_id text,
date text,
time timestamp,
latitude double,
longtitude double,
PRIMARY KEY ((vehicle_id, date), time)
) WITH CLUSTERING ORDER BY (time DESC)
AND additional_write_policy = '99p'
AND bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND cdc = false
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND memtable = 'default'
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND extensions = {}
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair = 'BLOCKING'
AND speculative_retry = '99p';


Provide the token function with the compound keys. Compound keys are hashed and stored in corresponding nodes.


cqlsh:linkedin> select token(vehicle_id,date) from location;

system.token(vehicle_id, date)
--------------------------------
-7657837382140274291
-7657837382140274291
-7657837382140274291
-7657837382140274291
-7657837382140274291
-7657837382140274291
7624412873298128873
7624412873298128873
7624412873298128873
7624412873298128873
7624412873298128873
7624412873298128873
8294848196898204914
8294848196898204914
8294848196898204914
8294848196898204914
8294848196898204914
8294848196898204914

(18 rows)


Use nodetool getendpoint function to figure out where they reside.


cassandra@cassandra02:/var/log/cassandra$ nodetool getendpoints linkedin location '8294848196898204914'
192.168.1.35
cassandra@cassandra02:/var/log/cassandra$ nodetool getendpoints linkedin location '-7657837382140274291'
192.168.1.32

Cassandra: Adding Cassandra node

A quick guide on how to add a Cassandra node on Ubuntu OS.


Specification
VMware Fusion Professional 13.0.2

/var/log/cassandra$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.3 LTS
Release: 22.04
Codename: jammy

cqlsh cassandra01
Connected to Test Cluster at cassandra01:9042
[cqlsh 6.1.0 | Cassandra 4.1.3 | CQL spec 3.4.6 | Native protocol v5]



Adding Cassandra node
Requirement
1 - a cluster name:  Test Cluster (default and making sure all nodes have the same name)
2 - a static IP for both nodes: 192.168.1.32, 192.168.1.35
3 - delete the cloned nodes' data

Steps

Step 1: Clone the primary node to other nodes

Step 2: Set both nodes IP address to static IP. In my lab, I simply set them to 2 fictitious IPs - 192.168.1.32, 192.168.1.35

Test them both can be ping and ssh.


Step 3: change hostname
sudo vim /etc/hostname
cassandra1


Step 4: Add IP and hostname to /etc/hosts

192.168.1.32 cassandra01
192.168.1.35 cassandra02


Step 5: Reboot the VM

Perform the same for all other nodes and reboot

Step 6: Change the listen_address and rpc_address properties in the cassandra.yaml for each node.
set the IP address as the corresponding node had. If node1 have 192.168.1.1, the listener_address and rpc_address should also have 192.168.1.1 and if node2 has 192.168.1.2 then the listener and rpc should also have 192.1.168.2



Step7: Need at least one seed node for others to join the cluster

Step 8: Restart Cassandra

sudo service cassandra restart


Step 9:  Edit the Cassandra seed section within the cassandra.yaml file and replace a primary IP address on it or all nodes. Perform the same for node2 with the primary IP address.


Step 10: Delete node2 data directory and restart

cassandra@cassandra02:/var/log/cassandra$ ls -las /var/lib/cassandra/
total 24
4 drwxr-xr-x 6 cassandra cassandra 4096 Aug 15 16:39 .
4 drwxr-xr-x 42 root root 4096 Aug 15 16:39 ..
4 drwxr-xr-x 2 cassandra cassandra 4096 Sep 29 16:36 commitlog
4 drwxr-xr-x 8 cassandra cassandra 4096 Aug 17 21:18 data
4 drwxr-xr-x 2 cassandra cassandra 4096 Aug 15 16:39 hints
4 drwxr-xr-x 2 cassandra cassandra 4096 Sep 28 16:31 saved_caches


cassandra@cassandra02:/var/log/cassandra$ sudo service cassandra stop 


cassandra@cassandra02:/var/log/cassandra$ sudo rm -rf /var/lib/cassandra/*


cassandra@cassandra02:/var/log/cassandra$ ps auwx | grep cassandra
root 2048 0.0 0.1 18368 9636 ? Ss 16:02 0:00 sshd: cassandra [priv]
cassand+ 2114 0.0 0.0 18500 6460 ? S 16:02 0:00 sshd: cassandra@pts/0
cassand+ 4616 0.0 0.0 6024 2008 pts/0 R+ 16:47 0:00 grep --color=auto cassandra


cassandra@cassandra02:/var/log/cassandra$ sudo service cassandra start


cassandra@cassandra02:/var/log/cassandra$ nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack 
UN 192.168.1.32 265 KiB 16 100.0% 37562f38-b9da-4e77-b44d-6572248ec7d1 rack1

cassandra@cassandra02:/var/log/cassandra$ nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack 
UN 192.168.1.35 79.81 KiB 16 51.2% d9d37072-817a-4095-87da-c4fc7a4686f8 rack1
UN 192.168.1.32 265 KiB 16 48.8% 37562f38-b9da-4e77-b44d-6572248ec7d1 rack1




In summary, it adds the listen_address, rpc_address, seeds, deletes the added node's directory, and starts node2 Cassandra.


With the help of the following guide.

Tuesday, August 29, 2023

Cassandra: Installing Cassandra on Linux (Centos and Ubuntu)

Quick guide to install Cassandra on linux. This guide will demonstrate the installation of Cassandra on both Centos and Ubuntu. Ubuntu version is at the lower part of the guide.

 

3 types of installation

  • Through linux installation packages (rpm/yum)
  • Through tarball
  • Through container (kubernetes/docker)

Note: This guide will focus on cassandra installation from package management.

Installation

Installing cassandra8 on Centos8 

Verify Centos version

cat /etc/redhat-release
CentOS Stream release 8

Update the OS

sudo yum update
<restart the system>


Install Java as requirement for Cassandra

sudo dnf install java-1.8.0-openjdk-devel -y


Verify Java version

openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-b08)
OpenJDK 64-Bit Server VM (build 25.362-b08, mixed mode)


Install cassandra

Download Datastax community edition

Instructions

OR

and easier way to do it with package manager.
sudo vi  /etc/yum.repos.d/cassandra.repo

[cassandra] name=Apache Cassandra baseurl=https://www.apache.org/dist/cassandra/redhat/311x/ gpgcheck=1 repo_gpgcheck=1 gpgkey=https://www.apache.org/dist/cassandra/KEYS

sudo dnf install cassandra -y

sudo vi /etc/systemd/system/cassandra.service
[Unit]
Description=Apache Cassandra
After=network.target

[Service]
PIDFile=/var/run/cassandra/cassandra.pid
User=cassandra
Group=cassandra
ExecStart=/usr/sbin/cassandra -f -p /var/run/cassandra/cassandra.pid
Restart=always

[Install]
WantedBy=multi-user.target

start and enable cassandara
sudo systemctl daemon-reload
sudo systemctl start cassandra
sudo systemctl enable cassandra


Check status

[cassandra@localhost ~]$ nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address    Load       Tokens       Owns (effective)  Host ID                               Rack
UN  127.0.0.1  70.87 KiB  256          100.0%            aba0f684-9f2f-42ce-8032-0cea75541e5d  rack1



Requirement for cqlsh: Install python 2
sudo dnf install python2
sudo alternatives --set python /usr/bin/python2

Now, “clash” is accessible. 

Check version
cqlsh> show version
[cqlsh 5.0.1 | Cassandra 3.11.13 | CQL spec 3.4.4 | Native protocol v4]

cqlsh> select cql_version from system.local;
 cql_version
-------------
       3.4.4

(1 rows)

Nodestool
[cassandra@localhost ~]$ nodetool version;
ReleaseVersion: 3.11.13


Path and directories

cassandra.yaml is at /etc/cassandra/default.conf/cassandra.yaml
data directory - /var/lib/cassandra
log directory - /var/log/cassandra



Installing Cassandra8 on Ubuntu

This installation will be slightly simpler than rpm's. Installation on Macbook M1.

lsb_release -a
No LSB modules are available.
Distributor ID:  Ubuntu
Description:     Ubuntu 22.04.3 LTS
Release:    22.04
Codename:   jammy


echo "deb https://debian.cassandra.apache.org 41x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list

curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add 

sudo apt-get update

sudo apt-get install cassandra

Some additional Nodetool (e.g sstabledump) will need to be installed separately for Ubuntu version
 
sudo apt-get install cassandra-tools
[sudo] password for cassandra: 
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  cassandra-tools
0 upgraded, 1 newly installed, 0 to remove and 13 not upgraded.
Need to get 4,920 B of archives.
After this operation, 27.6 kB of additional disk space will be used.
Get:1 https://apache.jfrog.io/artifactory/cassandra-deb 41x/main arm64 cassandra-tools all 4.1.3 [4,920 B]
Fetched 4,920 B in 2s (2,652 B/s)                 
Selecting previously unselected package cassandra-tools.
(Reading database ... 115981 files and directories currently installed.)
Preparing to unpack .../cassandra-tools_4.1.3_all.deb ...
Unpacking cassandra-tools (4.1.3) ...
Setting up cassandra-tools (4.1.3) ...
Scanning processes...                                                                                                                              
Scanning linux images...                                                                                                                     
 
No services need to be restarted.
 
No containers need to be restarted.
 
No user sessions are running outdated binaries.
 
No VM guests are running outdated hypervisor (qemu) binaries on this host.
 

Ubuntu Cassandra.yaml path is located in /etc/cassandra

Wednesday, March 8, 2023

VCSA 8.000x failed on Workstation installation with error "(get_install_parameter('upgrade.import.directory'), "vlcm""

VCSA requires some tweaking in order to deploy successfully on Workstation

This issue is unique to VC8 installation on Workstation. Likely not going to be fixed as it has been going on for a few months on multiple dot dot releases. The installation will fail at 68% with the following errors.  


Encountered an internal error. see /var/log/firstboot/vlcm_firstboot.py_10049_stderr.log
Resolution
This is an unrecoverable error, please retry install. If you encounter this error again, please search for these symptoms in the VMware Knowledge Base for any known issues and possible resolutions. If none can be found, collect a support bundle and open a support request.

Traceback (most recent call last):
File "/usr/lib/vmware-vlcm/firstboot/vlcm_firstboot.py", line 167, in <module>
main()
File "/usr/lib/vmware-vlcm/firstboot/vlcm_firstboot.py", line 129, in main
fb = VlcmFirstboot(VLCM_COMP, VLCM_SOLUSERNAME)
File "/usr/lib/vmware-vlcm/firstboot/vlcm_firstboot.py", line 50, in __init__
os.path.join(get_install_parameter('upgrade.import.directory'), "vlcm")
File "/usr/lib/vmware/site-packages/cis/tools.py", line 88, in get_install_parameter
raise InstallParameterException('Install-parameter %s not set' % param)
cis.exceptions.InstallParameterException: {
"detail": [
{
"id": "install.ciscommon.internal.error",
"translatable": "Encountered an internal error.\n\n%(0)s",
"args": [
"Install-parameter upgrade.import.directory not set"
],
"localized": "Encountered an internal error.\n\nInstall-parameter upgrade.import.directory not set"
}
],
"componentKey": null,
"problemId": null,
"resolution": {
"id": "install.default.failure.resolution",
"translatable": "This is an unrecoverable error, please retry install. If you encounter this error again, please search for these symptoms in the VMware Knowledge Base for any known issues and possible resolutions. If none can be found, collect a support bundle and open a support request.",
"localized": "This is an unrecoverable error, please retry install. If you encounter this error again, please search for these symptoms in the VMware Knowledge Base for any known issues and possible resolutions. If none can be found, collect a support bundle and open a support request."
}
}

The workaround is fairly simple.

Step 1: Copy ova file from the ISO into another read/write directory. E.g Download directory.
Step 2: use the ovftool within the mounted installation ISO media to convert the ova to ovf file. It will generate a few large files (the disks, the manifest file, and ovf file)


C:\WINDOWS\system32>D:\vcsa\ovftool\win32\ovftool C:\Users\test\Downloads\VMware-vCenter-Server-Appliance-8.0.0.10200-21216066_OVF10.ova C:\Users\test\Downloads\VMware-vCenter-Server-Appliance-8.0.0.10200-21216066_OVF10.ovf
Opening OVA source: C:\Users\test\Downloads\VMware-vCenter-Server-Appliance-8.0.0.10200-21216066_OVF10.ova
The manifest validates
The provided certificate is in valid period
Source is signed but could not verify certificate (possibly self-signed)
Certificate information:
CertIssuer:/C=US/ST=California/L=Palo Alto/O=VMware, Inc.
CertSubject:/C=US/ST=California/L=Palo Alto/O=VMware, Inc.
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyy
zzzzzzzzzzzzzzzzzz
-----END CERTIFICATE-----


Opening OVF target: C:\Users\test\Downloads\VMware-vCenter-Server-Appliance-8.0.0.10200-21216066_OVF10.ovf
Writing OVF package: C:\Users\test\Downloads\VMware-vCenter-Server-Appliance-8.0.0.10200-21216066_OVF10.ovf
Transfer Completed
Completed successfully

Step 3: Delete the manifest file. 

Step 4: The "guestinfo.cis.upgrade.import.directory" ovf "userConfigurable=false" needs to be set to true. 

-  Edit the ovf file with a text editor.
-  Search for "guestinfo.cis.upgrade.import.directory" and change the userConfigurable parameter from false to true. Save and Close.

That's it. Continue to normal installation with the new OVF file instead of the original OVA file.

Credit to William Lam's blog post.